【问题标题】:Elasticsearch: optimizing query with filter and constant_score?Elasticsearch:使用过滤器和 constant_score 优化查询?
【发布时间】:2019-02-07 12:32:46
【问题描述】:

在 Udemy 教程中,我在这里遇到了这个查询:

{ "query": { "bool": {
    "must": {"match": {"genre": "Sci-Fi"}},
    "must_not": {"match": {"title": "trek"}},
    "filter:" {"range": {"year": {"gte": 2010, "lt": 2015}}}
}}}

我想知道是否可以优化它?我正在考虑两种可能的方法:

  1. 将“流派”置于过滤器上下文中。但是一部电影可能有多种类型,所以我不确定使用 type keyword 和 filter-term 是否可以在那里工作。

  2. 将“must_not”直接放在过滤器上下文中(没有布尔值)将不起作用,因为据我所知过滤器不允许“过滤掉”,只能“过滤要保留的内容”。但是,如果我将 must_not 包装在 constant_score 或 filter-bool 中,查询会更高效吗?还是 ES 会自动处理这些优化?我只是不明白为什么 must_not 在查询中而不是首先过滤上下文。是否可以仅部分不匹配,从而仅将分数降低一个程度?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    关于1:

    genre 匹配移动到过滤器上下文可能会加快速度(尽管这取决于许多其他因素),但您会失去排名,这可能对您来说很重要,也可能不重要。最后,当排名很重要时使用must,如果不重要并且您的唯一目标是匹配文档或未给出某些标准,请使用filter

    此外,使用 type 关键字只会让您获得“完全匹配”语义,它可能是您想要的...或不是,取决于您创建查询的方式(用户输入或受控选择列表)...

    关于2:

    must_notalready in a filter context,所以它不会比您已经看到的更简单。过滤器上下文由filter + must_not 组成。

    我要添加的最后一件事,当有人问及性能优化时我总是添加:Premature optimization is the root of all evil 所以只有在您真正看到性能问题时才这样做,以前从来没有。

    【讨论】:

    • 啊,谢谢,我认为过滤器/查询上下文中的某些内容意味着它可以包装在过滤器或查询的 {...} 范围内。因此,如果它对分数没有贡献,您可以将 must_not 置于查询之下但不置于过滤之下,这有点令人困惑。
    • 这是出于历史原因。如果你查看我分享的链接,他们会深入解释它是如何工作的。很高兴我能澄清一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多