python - Elasticsearch-DSL嵌套过滤

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

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

相关文章:

python - ROT(n) 编码器和解码器,但解码器不工作

php - Laravel队列 worker 卡住了89MB的内存使用量

elasticsearch - 如何使用 NEST 客户端获取 Elasticsearch 服务器的版本?

python - 如何使用变量名 pandas df.assign()?

python - 正则表达式总是贪婪的,即使我给它非捕获括号?

python - Tensorflow ctc_loss_calculator : No valid path found

java - 是否可以将 Integer.MAX_VALUE 传递给elasticsearch而不影响性能?

python - 如何使用非官方的 Google Trend API ( pyGTrends.py)

python - 根据某些条件将连续列转换为Python中的二进制

python - 找出列中最大的数字