如何使用elasticsearch DSL for python访问响应对象

时间:2016-06-15 13:12:33

标签: python elasticsearch elasticsearch-dsl

我有以下代码:

s = Search(using=Elasticsearch('http://user:passwd@ipaddress'), index="myindex")
q = Q("multi_match", query='some query', fields=['_all'])
s = s.query(q)

response = s.execute()
print('Total %d hits found.' % response.hits.total)
for hit in response:
    print(hit.title)

我收到错误:

Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/elasticsearch_dsl/utils.py", line 102, in __getattr__
return _wrap(self._d_[attr_name])
KeyError: 'title'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "FindImage.py", line 89, in <module>
main(args.image_file)
File "FindImage.py", line 82, in main
query_db([1], [2])
File "FindImage.py", line 77, in query_db
print(hit.title)
File "/usr/local/lib/python3.5/dist-packages/elasticsearch_dsl/utils.py", line 105, in __getattr__
'%r object has no attribute %r' % (self.__class__.__name__, attr_name))
AttributeError: 'Result' object has no attribute 'title'

然而,这与文档所述的内容完全矛盾: Docs

我做错了什么?如何从响应中正确提取命中和值?

修改

此外,响应对象应该有一个方法&#34; toDict&#34;但是当我试着调用它时,我再次得到一个AttributeError。

2 个答案:

答案 0 :(得分:1)

显然“.title”引用了他们示例中的实际列。 当我使用hit.doc.FIRSTTAG时,FIRSTTAG是MY NoSQL-db中的一个列。 仍然没有解释丢失的方法,但我现在很高兴。

对于有同样问题的人:

在评估响应对象时使用您自己的列名称,例如在我的例子中:

for hit in response:
  print(hit.doc.FIRSTTAG)

答案 1 :(得分:1)

对于“ toDict”问题,response.to_dict()对我有用。不知道此行为在lib版本之间是否相同。