在ES中MUST和SHOULD bool查询的区别是什么?
如果我只想要包含我的条款的结果,我应该使用必须?
我有一个查询,应该只包含某些值,也没有结果,有一个较低的日期/时间戳比今天的时间/日期-现在
Also
我可以使用多个过滤器内部必须像下面的代码:
"filtered": {
"filter": {
"bool" : {
"must" : {
"term" : { "type" : 1 }
"term" : { "totals" : 14 }
"term" : { "groupId" : 3 }
"range" : {
"expires" : {
"gte": "now"
}
}
},
must表示子句(查询)必须出现在匹配的文档中。这些子句必须匹配,就像逻辑与。
should的意思是:这些子句中至少有一个必须匹配,就像逻辑或。
基本上它们就像逻辑运算符AND和OR一样被使用。看到这个。
现在在bool查询中:
must的意思是:必须与要包含的文档相匹配的子句。
should的意思是:如果这些子句匹配,他们增加_score;否则,它们就没有效果。它们只是用于细化每个文档的相关性评分。
是的,你可以在内部使用多个过滤器。
由于这是一个很受欢迎的问题,我想补充一点,在Elasticsearch版本2中,事情发生了一些变化。
应该在顶层使用bool查询,而不是过滤查询。
如果你不关心必须部分的分数,那么将这些部分放入过滤器键。没有评分意味着更快的搜索速度。此外,Elasticsearch将自动找出,是否缓存它们,等must_not是同样有效的缓存。
参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html
另外,注意"gte": "now"不能被缓存,因为它是毫秒级的粒度。在must子句中使用两个范围:一个带now/1h,另一个带now,这样第一个范围可以缓存一段时间,第二个范围用于在较小的结果集上加速精确过滤。