首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Elasticsearch-dsl嵌套过滤

Elasticsearch-dsl嵌套过滤
EN

Stack Overflow用户
提问于 2019-12-12 23:07:01
回答 1查看 277关注 0票数 0

我使用的是elasticsearch-dsl库,我的文档如下:

代码语言:javascript
复制
class Market(InnerDoc):
    market_no = Integer()

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

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

示例数据:

代码语言:javascript
复制
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。

代码语言:javascript
复制
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}]}
]

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-16 18:22:51

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

代码语言:javascript
复制
Event.search().query(
    Nested(path='markets', query=Range(markets__market_no={'lte':2}))
)

如果您希望获得所有事件,而不考虑markets.market_no值(如果没有包含market_no <=2 =>的市场,则事件的市场列表为空)

它会更复杂,但仍有可能(本例中只有查询):

代码语言:javascript
复制
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下)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59307532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档