在Udemy教程中,我在这里遇到此查询:
{ "query": { "bool": {
"must": {"match": {"genre": "Sci-Fi"}},
"must_not": {"match": {"title": "trek"}},
"filter:" {"range": {"year": {"gte": 2010, "lt": 2015}}}
}}}
我想知道是否有可能对其进行优化?我正在考虑两种可能的方式:
在过滤器上下文中放入“类型”。但是电影可能具有多种流派,所以我不确定使用type keyword和filter-term是否可以在那里工作。
在过滤器上下文中直接(没有bool)放置“ must_not”将不起作用,因为据我所知,过滤器不允许“过滤掉”,而只能“过滤保留的内容”。但是,如果将must_not包装在constant_score或filter-bool中,查询的性能会更好吗?还是ES会自动进行此类优化?我只是不明白为什么must_not在查询中而不是首先过滤上下文。某些东西只能部分不匹配,从而只能将分数降低一定程度吗?
答案 0 :(得分:1)
关于1:
将genre
匹配项移至过滤器上下文可能会加快速度(尽管这取决于许多其他因素),但您会失去排名,这对于您。最后,如果排名很重要,则使用must
;如果排名不重要,则使用filter
,并且您的唯一目标是匹配文档或不提供某些标准。
此外,使用type关键字只会使您获得“完全匹配”的语义,这可能是您想要的...取决于您创建查询(用户输入或受控选择列表)的方式...
关于2:
must_not
是already in a filter context,因此没有比您已经看到的更简单的了。过滤器上下文由filter
+ must_not
组成。
我要添加的最后一件事是,当有人问到性能优化时,我总是添加:Premature optimization is the root of all evil,所以只有在您实际看到性能问题时才这样做。