0

我正在使用 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}]}
]

谢谢。

4

1 回答 1

0

为了获得至少有一个market_no <= 2 的市场的事件:

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

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

它会更复杂但仍然可能(仅在此示例中查询):

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 下)

于 2019-12-16T10:22:51.450 回答