我正在使用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}]}
]
谢谢。
最佳答案
为了获得具有至少一个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下)
关于python - Elasticsearch-DSL嵌套过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59307532/