一个查询语句究竟具有什么样的行为和得到什么结果,主要取决于它到底是处Query
还是Filter
。两者有很大区别,我们来看下:
-
Query context 查询上下文
这种语句在执行时既要计算文档是否匹配,还要计算文档相对于其他文档的匹配度有多高,匹配度越高,_score
分数就越高 -
Filter context 过滤上下文
过滤上下文中的语句在执行时只关心文档是否和查询匹配,不会计算匹配度,也就是得分。
看下官方的例子
GET /_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
对上面的例子分析下:
-
query
参数表示整个语句是处于 query context 中 -
bool
和match
语句被用在 query context 中,也就是说它们会计算每个文档的匹配度(_score) -
filter
参数则表示这个子查询处于 filter context 中 -
filter
语句中的term
和range
语句用在 filter context 中,它们只起到过滤的作用,并不会计算文档的得分。
网友评论