一个查询语句究竟具有什么样的行为和得到什么结果,主要取决于它到底是处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 中,它们只起到过滤的作用,并不会计算文档的得分。











网友评论