我正在尝试构建存储在某些数据结构(可能是树)中的任意嵌套查询。
From the manual我认为filter
类型的查询是特殊类型的Bool
查询,因此
s = Search()
s = s.filter('terms', tags=['search', 'python'])
和
s = Search()
s = s.query('bool', filter=[Q('terms', tags=['search', 'python'])])
是一样的。 我在我的查询中试过这个,但有些东西不能正常工作。
此第一个查询有效并返回预期结果:
s = Search(using=client, index='index')
s = s.filter('term', some_field=some_value)
print(s.to_dict())
>>> {'query': {'filtered': {'filter': {'term': {'some_field': 'some_value'}}, \
'query': {'match_all': {}}}}}
模仿查询中的示例似乎不起作用:
s = Search(using=client, index='index')
s = s.query(Q('bool', filter=[Q('term', some_field=some_value])]))
print(s.to_dict())
>>> {'query': {'bool': {'filter': [{'term': {some_field': some_value}}]}}
请注意,我使用的是ElasticSearch的第1版,因为AWS尚未升级。
答案 0 :(得分:0)
如果您使用的是ES 1.x,则无法使用第二种方式,即产生bool/filter
查询的方式。
如果您收到该查询,则表示您正在使用elasticsearch-dsl 2.x或更高版本,which is not correct。
您需要修改requirements.txt
文件以包含此
# Elasticsearch 1.x
elasticsearch-dsl<2.0.0