从Elasticsearch字典列表提取教授信息失败问题排查
解决Elasticsearch数据提取中professor列表为空的问题
问题回顾
你从Elasticsearch获取了嵌套结构的searchtest数据,想要提取课程名称、教授姓名和部门信息,但运行代码后proffesor列表始终是空的,核心问题出在遍历教授信息的那一行代码上。
根据你的描述,数据结构是:每个搜索结果元素包含_source字段,_source下的professor是一个包含name、department等键的字典(而非列表)。你运行的原代码、当前输出和预期输出已经很清晰,接下来我们分析错误原因并给出修复方案。
错误原因分析
- 路径错误:你尝试从
each.get('professor', [])获取教授信息,但实际上professor字段是在each['_source']这个层级下,直接从each里找肯定拿不到数据,返回的是空列表,循环自然不会执行。 - 数据结构误解:你用了
for prof in ...循环,但根据描述professor是单个字典,不是列表,即便路径正确,循环也会报错或者没有效果。 - 拼写小问题:代码里的键是
proffesor(多了一个f),和字段名professor不一致,虽然这不是导致空列表的直接原因,但会影响后续数据的可读性和维护性。
修复后的代码
针对你的数据结构(professor是单个字典),修正后的代码如下:
import json import pprint def details(searchtest): response = [] for each in searchtest: # 先取出_source层级的数据,避免重复写路径 source_data = each['_source'] course = { 'name': source_data['name'], 'professor': [] # 修正拼写,和字段名保持一致 } # 从_source下正确获取professor字典 professor_info = source_data.get('professor', {}) # 确保professor信息存在再提取字段 if professor_info: course['professor'].append(professor_info['name']) course['professor'].append(professor_info['department']) response.append(course) return response if __name__ == "__main__": pp = pprint.PrettyPrinter(4) pp.pprint(details(searchtest['hits']['hits']))
如果后续professor可能变成列表(比如一门课有多个教授),可以改成下面的版本,兼容两种情况:
import json import pprint def details(searchtest): response = [] for each in searchtest: source_data = each['_source'] course = { 'name': source_data['name'], 'professor': [] } # 获取professor数据,兼容单个字典或列表的情况 professors = source_data.get('professor', []) # 如果是单个字典,转成列表统一处理 if isinstance(professors, dict): professors = [professors] # 遍历教授信息 for prof in professors: course['professor'].append(prof['name']) course['professor'].append(prof['department']) response.append(course) return response if __name__ == "__main__": pp = pprint.PrettyPrinter(4) pp.pprint(details(searchtest['hits']['hits']))
预期输出示例
修复后你会得到类似这样的结果:
[ {'name': 'Cost Accounting 400', 'professor': ['Alice Brown', 'Accounting']}, {'name': 'Computer Internals 250', 'professor': ['Bob Wilson', 'Computer Science']}, {'name': 'Accounting Info Systems 350', 'professor': ['Charlie Davis', 'Accounting']}, ... ]
内容的提问来源于stack exchange,提问作者user6882757
相关产品推荐
相关产品推荐

