elasticsearch MUST和SHOULD bool查询的区别

j91ykkif  于 2023-06-21  发布在  ElasticSearch
关注(0)|答案(3)|浏览(243)

ES中MUSTSHOULD bool query有什么区别?
如果我ONLY想要包含我的术语的结果,那么我应该使用must吗?
我有一个查询,应该只包含某些值,也没有结果,有一个较低的日期/时间戳比今天的时间/日期-现在

还有

我可以使用多个过滤器内必须像下面的代码:

"filtered": {
"filter": {
"bool" : {
        "must" : {
            "term" : { "type" : 1 }
            "term" : { "totals" : 14 }
            "term" : { "groupId" : 3 }
            "range" : {
                "expires" : {
                    "gte": "now"
                }
            }
        },
wgx48brx

wgx48brx1#

必须表示:子句(查询)必须出现在匹配的文档中。这些子句必须匹配,如逻辑AND
应该表示:这些子句中至少有一个必须匹配,如逻辑OR

基本上,它们被用作逻辑运算符AND和OR。看这个
bool query中:

必须表示:* 必须 * 匹配以包含文档的子句。
应该表示:如果这两个子句匹配,则增加_score;否则,它们没有效果。它们仅用于细化每个文档的相关性分数。

是的,您可以在must中使用多个过滤器。

jecbmhm3

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,以便第一个可以缓存一段时间,第二个用于在较小的结果集上加速精确过滤。

vojdkbi0

vojdkbi03#

正如documentation中所说:
必须:子句(查询)必须出现在匹配的文档中。
应:子句(查询)应出现在匹配文档中。在没有must子句的布尔查询中,一个或多个should子句必须与文档匹配。要匹配的should子句的最小数量可以使用minimum_should_match参数设置。
换句话说,结果将必须被must* 子句中存在的所有查询匹配(或者如果没有 must 子句,则匹配至少一个**should* 子句)。
因为你想让你的结果满足所有的查询,你应该使用 must
您确实可以在布尔查询中使用过滤器。

相关问题