Elasticsearch:使用filter和constant_score优化查询吗?

时间:2019-02-07 12:32:46

标签: elasticsearch

在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. 在过滤器上下文中直接(没有bool)放置“ must_not”将不起作用,因为据我所知,过滤器不允许“过滤掉”,而只能“过滤保留的内容”。但是,如果将must_not包装在constant_score或filter-bool中,查询的性能会更好吗?还是ES会自动进行此类优化?我只是不明白为什么must_not在查询中而不是首先过滤上下文。某些东西只能部分不匹配,从而只能将分数降低一定程度吗?

1 个答案:

答案 0 :(得分:1)

关于1:

genre匹配项移至过滤器上下文可能会加快速度(尽管这取决于许多其他因素),但您会失去排名,这对于您。最后,如果排名很重要,则使用must;如果排名不重要,则使用filter,并且您的唯一目标是匹配文档或不提供某些标准。

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

关于2:

must_notalready in a filter context,因此没有比您已经看到的更简单的了。过滤器上下文由filter + must_not组成。

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