【问题标题】:Elasticsearch-dsl nested filteringElasticsearch-dsl 嵌套过滤
【发布时间】:2019-12-16 18:22:51
【问题描述】:

我正在使用 elasticsearch-dsl 库,我的文档如下所示:

class Market(InnerDoc):
    market_no = Integer()

class Event(Document):
    event_id = Integer()
    markets = Nested(Market)

我想获取所有事件,并在这些事件中过滤一些市场。如何通过使用 elasticsearch-dsl 来实现这一点?

示例数据:

events = [
    {'event_id': 1, 'markets': [{'market_no': 1}, {'market_no': 2}, {'market_no': 3}]}, 
    {'event_id': 2, 'markets': [{'market_no': 1}]}, 
    {'event_id': 3, 'markets': [{'market_no': 1}, {'market_no': 11}]}
]

我想要所有事件以及在这些事件中,过滤 market_no 低于或等于 2 的市场。

results = [
    {'event_id': 1, 'markets': [{'market_no': 1}, {'market_no': 2}]}, 
    {'event_id': 2, 'markets': [{'market_no': 1}]}, 
    {'event_id': 3, 'markets': [{'market_no': 1}]}
]

谢谢。

【问题讨论】:

    标签: python python-3.x elasticsearch elasticsearch-dsl-py


    【解决方案1】:

    为了获得至少有一个market_no

    Event.search().query(
        Nested(path='markets', query=Range(markets__market_no={'lte':2}))
    )
    

    如果您想获取所有的事件,尽管有markets.market_no 值(如果没有market_no 的市场导致事件的市场列表为空)

    这会更复杂但仍然可能(本例中仅查询):

    from elasticsearch_dsl.query import Nested, Range, Bool, MatchAll
    
    Bool(should=[MatchAll(), Nested(path='markets', query=Range(markets__market_no={'lte':2}), inner_hits={"size": 100})])
    

    您必须自己设置内部命中限制并从响应中的单独字段中提取市场匹配项(它不会在 _source 中,而是在 hits.hits.inner_hits.markets 下)

    【讨论】:

      猜你喜欢
      • 2018-10-17
      • 1970-01-01
      • 2017-07-27
      • 2018-01-30
      • 2014-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多