674
Elasticsearch中 Query 与 Filter 的区别
Query 与 Filter的区别:
Query要回答的问题是,匹配度有多高,并计算出匹配分数。其关注点是Match.
Filter要回答的问题是,匹配与否,并且不需要计算分数,其关注点是Included or not.
Query查询结果不会缓存。
Filter查询的结果会缓存。
Query走的是倒排索引。
Filter走的是Bitsets.
Query应用场景:全文检索,模糊匹配。
Filter适用于细化查询。
所以Filter查询一般情况下具有更好的性能,推荐优先使用。
一个lucence金科玉律是: 能用filter就用filter, 除非必须使用query(当且仅当你需要算分的时候)
注:
ES1.X版本中,query和filter是分开的,存在filtered检索类型中,如:
GET /_search
{
"query": {
"filtered": {
"query":{...},
"filter":{...}
}
}
}
ES2.X及以后版本中,filter是可以作为query的子查询的,如:
GET /_search
{
"query":{
"bool": {
"must": [
{"match": {"title": "xxx"}},
{"match": {"content": "xxxx"}}
],
"filter": [
{"term": {"status": "published"}},
{"range": {"publish_date":{"gte": "2019-01-01"}}}
]
}
}
}