弹性搜索DSL python问题

时间:2017-08-04 14:47:31

标签: python elasticsearch

我一直在使用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'遇到了同样的问题。我想知道访问我的文档的正确方法是什么?

真的很感激任何帮助!

2 个答案:

答案 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