【问题标题】:Create filter queries by hand using elasticsearch_dsl使用 elasticsearch_dsl 手动创建过滤器查询
【发布时间】:2016-06-14 22:07:13
【问题描述】:

我正在尝试构建存储在某些数据结构(可能是树)中的任意嵌套查询。 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 尚未升级。

【问题讨论】:

    标签: python elasticsearch elasticsearch-dsl


    【解决方案1】:

    如果您使用的是 ES 1.x,则不能使用第二种方式,即产生 bool/filter 查询的方式。

    如果您收到该查询,则表示您使用的是 elasticsearch-dsl 2.x 或更高版本,which is not correct

    您需要修改您的 requirements.txt 文件以包含此文件

    # Elasticsearch 1.x
    elasticsearch-dsl<2.0.0
    

    【讨论】:

    • 从您发送的链接中,“该库与自 1.x 以来的所有 Elasticsearch 版本兼容,但您必须使用匹配的主要版本:”,我已经在使用它。不是说1.x版本不支持bool/filter
    • bool/filter 已在 ES 2.x 中引入,因此我可以向您保证 1.x 版本不支持它
    • 这个运气好吗?
    • 还没有。我现在恢复到纯 json 查询。我也可能误解了你的评论,但我认为bool/filters1.x 版本中呢? elastic.co/guide/en/elasticsearch/reference/1.5/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2017-10-28
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    相关资源
    最近更新 更多