Elasticsearch必须与SHOULD之间的区别bool查询

在ES中, MUSTSHOULD bool查询有什么区别?

如果我想要包含我的条款的结果,那么我应该使用must

我有一个查询应该只包含某些值,也没有结果的date/时间戳比今天的时间/date – 现在

我可以使用多个filter里面的代码如下:

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

必须意味着:子句(查询)必须出现在匹配的文档中。 这些条款必须符合逻辑AND

应该意味着:这些子句中至less有一个必须匹配,如逻辑OR

基本上它们被用作逻辑运算符AND和OR。 看到这个

现在在一个布尔查询 :

必须意味着:必须与要包括的文件匹配的条款。

应该表示:如果这些子句匹配,则增加_score; 否则,它们不起作用。 它们仅用于改进每个文档的相关性分数。


是的,你可以在必须使用多个filter。

由于这是一个受欢迎的问题,我想补充一点,在Elasticsearch版本2中,情况有所改变。

而不是filtered查询,应该使用顶层的bool查询。

如果你不关心must零件的分数,然后把这些零件放入filter关键。 没有得分意味着更快的search。 此外,Elasticsearch会自动计算出是否caching它们等must_not同样适用于caching。

参考: https : //www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

此外,请注意, "gte": "now"不能被caching,因为毫秒粒度。 在must子句中使用两个范围:一个是now/1h ,另一个是now这样第一个可以被caching一段时间,第二个精确的过滤在较小的结果集上加速。

正如文件中所说:

必须:子句(查询)必须出现在匹配的文档中。

应该:子句(查询)应该出现在匹配的文档中。 在一个没有must子句的布尔查询中,一个或多个should子句必须匹配一个文档。 可以使用minimum_should_match参数来设置要匹配的最less的子句数。

换句话说,结果必须must子句中存在的所有查询匹配(或者如果没有must子句,则至less匹配should子句中的一个)

既然你想要你的结果满足所有的查询,你应该使用must


你确实可以在布尔查询中使用filter。