无法访问elasticsearch_dsl的meta.id字段,该如何解决?
问题描述
我希望使用meta ID字段基于搜索到的数据新增索引/字段,但无法访问meta.id字段,请问该如何处理?以下是我的代码:
from elasticsearch import Elasticsearch from elasticsearch_dsl import Search es = Elasticsearch(Host="http://localhost", PORT=9200) request = Search(using=es, index='internal', doc_type="doc") response = request.scan() for each in response: alert = each.to_dict() print(alert["id"])
解决方案
嘿,我来帮你搞定这个问题!
在elasticsearch-dsl里,搜索返回的每个结果对象(也就是你代码里的each),它的元数据(包括文档ID)并不在to_dict()返回的字典里,而是作为对象的直接属性存在的。所以你完全不用先转成字典再找ID,直接访问each.meta.id就能拿到啦。
另外还要提醒你个小细节:你代码里初始化Elasticsearch客户端的参数有问题——正确的参数名是小写的host和port,或者直接用hosts参数传完整地址,大写的参数名会导致客户端初始化失败哦。
修改后的代码可以参考下面的写法:
from elasticsearch import Elasticsearch from elasticsearch_dsl import Search # 修正Elasticsearch客户端初始化参数 es = Elasticsearch(host="localhost", port=9200) # 或者直接传完整地址:es = Elasticsearch(hosts="http://localhost:9200") request = Search(using=es, index='internal', doc_type="doc") response = request.scan() for each in response: # 直接获取文档的meta ID doc_meta_id = each.meta.id print(doc_meta_id) # 如果需要把这个ID加到你的alert字典里,用于后续新增索引/字段 alert = each.to_dict() alert["meta_id"] = doc_meta_id # 接下来就可以用这个包含meta ID的alert数据去做你需要的操作了
这样你就能顺利拿到meta ID,然后基于它完成新增索引或字段的需求啦。
内容的提问来源于stack exchange,提问作者Rob X
相关产品推荐
相关产品推荐

