ES中的MUST和SHOULDbool查询有什么区别?
如果我只想要包含我的条款的结果,那么我应该使用must吗?
我的查询应该只包含某些值,并且没有比今天的时间/日期更低的日期/时间戳的结果 - 现在
也
我可以在下面的代码中使用多个过滤器:
"filtered": {
"filter": {
"bool" : {
"must" : {
"term" : { "type" : 1 }
"term" : { "totals" : 14 }
"term" : { "groupId" : 3 }
"range" : {
"expires" : {
"gte": "now"
}
}
},
Run Code Online (Sandbox Code Playgroud)
Uts*_*awn 202
必须表示:子句(查询)必须出现在匹配的文档中.这些子句必须匹配,就像逻辑AND一样.
应该意味着:这些子句中至少有一个必须匹配,就像逻辑OR一样.
基本上它们像逻辑运算符AND和OR一样使用.看到这个.
现在在bool查询中:
必须表示:必须与要包含的文档匹配的子句.
应该意味着:如果这些条款匹配,它们会增加_score; 否则,它们没有效果.它们仅用于优化每个文档的相关性分数.
是的你可以在里面使用多个过滤器must.
Hes*_*oon 13
正如文档中所说:
Must:子句(查询)必须出现在匹配的文档中。
应该:子句(查询)应该出现在匹配的文档中。在没有 must 子句的布尔查询中,一个或多个 should 子句必须匹配一个文档。可以使用 minimum_should_match 参数设置要匹配的最小应该子句数。
换句话说,结果必须由匹配所有查询呈现在绝条款(或匹配的至少一个所述的应该子句如果没有必须的子句。
由于您希望结果满足所有查询,因此您应该使用must。
您确实可以在布尔查询中使用过滤器。
Tau*_*kas 13
由于这是一个很受欢迎的问题,我想补充一点,在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以便第一个可以缓存一段时间,第二个用于精确过滤在较小的结果集上加速.
| 归档时间: |
|
| 查看次数: |
76936 次 |
| 最近记录: |