ES中MUST
和SHOULD
bool query有什么区别?
如果我ONLY想要包含我的术语的结果,那么我应该使用must
吗?
我有一个查询,应该只包含某些值,也没有结果,有一个较低的日期/时间戳比今天的时间/日期-现在
还有
我可以使用多个过滤器内必须像下面的代码:
"filtered": {
"filter": {
"bool" : {
"must" : {
"term" : { "type" : 1 }
"term" : { "totals" : 14 }
"term" : { "groupId" : 3 }
"range" : {
"expires" : {
"gte": "now"
}
}
},
3条答案
按热度按时间wgx48brx1#
必须表示:子句(查询)必须出现在匹配的文档中。这些子句必须匹配,如逻辑AND。
应该表示:这些子句中至少有一个必须匹配,如逻辑OR。
基本上,它们被用作逻辑运算符AND和OR。看这个
在bool query中:
必须表示:* 必须 * 匹配以包含文档的子句。
应该表示:如果这两个子句匹配,则增加
_score
;否则,它们没有效果。它们仅用于细化每个文档的相关性分数。是的,您可以在
must
中使用多个过滤器。jecbmhm32#
由于这是一个流行的问题,我想补充一点,在Elasticsearch版本2中,事情有所改变。
在顶层应该使用
bool
查询,而不是filtered
查询。如果你不关心
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
,以便第一个可以缓存一段时间,第二个用于在较小的结果集上加速精确过滤。vojdkbi03#
正如documentation中所说:
必须:子句(查询)必须出现在匹配的文档中。
应:子句(查询)应出现在匹配文档中。在没有must子句的布尔查询中,一个或多个should子句必须与文档匹配。要匹配的should子句的最小数量可以使用minimum_should_match参数设置。
换句话说,结果将必须被must* 子句中存在的所有查询匹配(或者如果没有 must 子句,则匹配至少一个**should* 子句)。
因为你想让你的结果满足所有的查询,你应该使用 must。
您确实可以在布尔查询中使用过滤器。