我一直在使用ElasticSearch DSL python包来查询我的弹性搜索数据库。查询方法非常直观,但我在检索文档时遇到问题。这就是我的尝试:
from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search
es = Elasticsearch(hosts=[{"host":'xyz', "port":9200}],timeout=400)
s = Search(using=es,index ="xyz-*").query("match_all")
response = s.execute()
for hit in response:
print hit.title
我得到的错误:
AttributeError: 'Hit' object has no attribute 'title'
我用Google搜索了错误并找到了另一个SO:How to access the response object using elasticsearch DSL for python
解决方案提到:
for hit in response:
print hit.doc.firstColumnName
不幸的是,我再次使用'doc'遇到了同样的问题。我想知道访问我的文档的正确方法是什么?
真的很感激任何帮助!
答案 0 :(得分:0)
我遇到了同样的问题,因为我发现了不同的版本,但这似乎取决于您所使用的elasticsearch-dsl库的版本。您可能会探索response
对象,它是子对象。例如,在5.3.0版中,我使用以下循环查看了预期的数据。
for hit in RESPONSE.hits._l_:
print(hit)
或
for hit in RESPONSE.hits.hits:
print(hit)
请注意,出于某些奇怪的原因,这些限制为10个数据元素。
print(len(RESPONSE.hits.hits))
10
print(len(RESPONSE.hits._l_))
10
如果我使用print('Total {} hits found.\n'.format(RESPONSE.hits.total))
打印匹配数,则与总匹配数不匹配
祝你好运!
答案 1 :(得分:0)
从版本6开始,响应不再返回您填充的Document类,这意味着您的字段只是一个AttrDict
,基本上是一个字典。
要解决此问题,您需要具有一个Document
类,该类代表您要解析的文档。然后,您需要使用.from_es()
方法使用文档类解析命中词典。
就像我在这里回答一样。
https://stackoverflow.com/a/64169419/5144029
也可以在这里查看Document
类
https://elasticsearch-dsl.readthedocs.io/en/7.3.0/persistence.html