我使用的是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}]}
]谢谢。
发布于 2019-12-16 18:22:51
为了获得至少有一个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下)
https://stackoverflow.com/questions/59307532
复制相似问题