首页 Elastic 正文
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"}}}
            ]
        }
    }
}

正在加载评论...