ES中的MUST
和SHOULD
bool查询之间有什么区别?
如果我仅想要包含我的条款的结果,那么我应该使用must
吗?
我的查询应该只包含某些值,而且没有比今天的时间/日期更低的日期/时间戳的结果 - 现在
同时
我可以在下面的代码中使用多个过滤器:
"filtered": {
"filter": {
"bool" : {
"must" : {
"term" : { "type" : 1 }
"term" : { "totals" : 14 }
"term" : { "groupId" : 3 }
"range" : {
"expires" : {
"gte": "now"
}
}
},
答案 0 :(得分:160)
必须表示:子句(查询)必须出现在匹配的文档中。这些条款必须匹配,如逻辑 AND 。
应该表示:这些子句中至少有一个必须匹配,例如逻辑 OR 。
基本上它们像逻辑运算符AND和OR一样使用。请参阅this。
现在在bool query:
必须表示:必须匹配要包含的文档的条款。
应该表示:如果这些子句匹配,则会增加_score
;否则,它们没有效果。它们仅用于优化每个文档的相关性分数。
是的,您可以在must
内使用多个过滤器。
答案 1 :(得分:12)
由于这是一个很受欢迎的问题,我想补充一点,在Elasticsearch版本2中,事情发生了一些变化。
而不是filtered
查询,应该在顶层使用bool
查询。
如果您不关心must
部分的得分,请将这些部分放入filter
键。没有得分意味着更快的搜索。此外,Elasticsearch会自动判断,是否缓存它们等。must_not
同样适用于缓存。
参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html
另外,请注意,由于毫秒级的粒度,"gte": "now"
无法缓存。在must
子句中使用两个范围:一个使用now/1h
,另一个使用now
,以便第一个可以缓存一段时间,第二个用于精确过滤,在较小的结果集上加速。
答案 2 :(得分:3)
如documentation中所述:
必须:子句(查询)必须出现在匹配的文档中。
应该:子句(查询)应该出现在匹配的文档中。在没有must子句的布尔查询中,一个或多个should子句必须与文档匹配。可以使用minimum_should_match参数设置要匹配的最小条件子数。
换句话说,结果必须与所有 必须子句中的查询匹配(或匹配至少一个如果没有必须子句,则应该子句。
由于您希望结果满足所有查询,因此您应该使用必须。
您确实可以在布尔查询中使用过滤器。