Elasticsearch批量导入遇TypeError及旧查询失效问题求助
解决Elasticsearch 6.3批量索引的两个核心问题
一、批量索引后查询无结果的根源及修复
你最初的批量索引代码犯了一个结构嵌套错误:
yield{ "_index":index_name, "_type":"businesses", "_source" :{ "body":entity } }
这段代码会把所有实体数据都塞进了body子字段里,最终文档结构变成了这样:
{ "body": { "entity_id": 123, "entity_name": "Premium Market", ... } }
而你的查询是直接搜索entity_name字段,但这个字段实际藏在body.entity_name路径下,自然匹配不到任何结果。
修复方案:直接把entity作为_source的取值,去掉多余的body嵌套:
def indexing(entity_list): for entity in entity_list: index_name = "demo" yield{ "_index": index_name, "_type": "businesses", "_source": entity # 直接传入实体字典,和单条索引结构一致 }
这样文档结构就和你单条索引时完全相同,原来的查询语句就能正常返回结果了。
二、TypeError: unhashable type: 'dict'的原因及修复
你修改后的代码里出现了Python语法错误:
yield{ "_index":index_name, "_type":"businesses", "doc" :{entity } # 这里的{entity}是错误写法 }
{entity}这种写法会让Python尝试把entity这个字典当作键来构建新字典,但字典是不可哈希的类型,所以直接抛出了类型错误。
另外补充一点:doc字段是用于更新文档的操作(比如update动作),而你是要批量写入新文档,应该用_source字段(对应bulk默认的index动作)。如果确实需要更新文档,正确写法应该是把entity直接赋值给doc:
# 仅作更新操作示例,你当前需求不需要这个 yield{ "_op_type": "update", "_index": index_name, "_type": "businesses", "_id": entity["entity_id"], # 更新必须指定文档ID "doc": entity }
回到你的批量索引需求,用第一部分修复后的_source写法就完全能解决问题。
三、快速验证修复效果
执行批量索引后,可以用这两步确认结果:
- 统计索引内的文档数量,确认数据已写入:
print(es.count(index="demo", doc_type="businesses"))
- 用你原来的match查询语句测试,应该能正常返回匹配结果了。
内容的提问来源于stack exchange,提问作者wizard
相关产品推荐
相关产品推荐

