## 过滤查询<Filter Query> ### 过滤查询 过滤查询<filter query>,其实准确来说,ES中的查询操作分为2种: `查询(query)`和`过滤(filter)`。查询即是之前提到的`query查询`,它 (查询)默认会计算每个返回文档的得分,然后根据得分排序。而`过滤(filter)`只会筛选出符合的文档,并不计算 得分,而且它可以缓存文档 。所以,单从性能考虑,过滤比查询更快。 换句话说**`过滤适合在大范围筛选数据,而查询则适合精确匹配数据。一般应用时, 应先使用过滤操作过滤数据, 然后使用查询匹配数据。`** ![](https://img.kancloud.cn/8c/92/8c922223362213a1db85c399c8d794bc_751x155.png) ### 使用 ```http GET /ems/emp/_search { "query": { "bool": { "must": [ {"match_all": {}} //查询条件 ], "filter": {....} //过滤条件 } } ``` - `注意:` - 在执行 filter 和 query 时,先执行 filter 在执行 query - Elasticsearch会自动缓存经常使用的过滤器,以加快性能。 ### 类型 > 常见过滤类型有: term 、 terms 、ranage、exists、ids等filter。 #### term 、 terms Filter ```http GET /ems/emp/_search # 使用term过滤 { "query": { "bool": { "must": [ {"term": { "name": { "value": "小黑" } }} ], "filter": { "term": { "content":"框架" } } } } } GET /dangdang/book/_search #使用terms过滤 { "query": { "bool": { "must": [ {"term": { "name": { "value": "中国" } }} ], "filter": { "terms": { "content":[ "科技", "声音" ] } } } } } ``` #### ranage filter ```http GET /ems/emp/_search { "query": { "bool": { "must": [ {"term": { "name": { "value": "中国" } }} ], "filter": { "range": { "age": { "gte": 7, "lte": 20 } } } } } } ``` #### exists filter > **过滤存在指定字段,获取字段不为空的索引记录使用** ```http GET /ems/emp/_search { "query": { "bool": { "must": [ {"term": { "name": { "value": "中国" } }} ], "filter": { "exists": { "field":"aaa" } } } } } ``` #### ids filter > **过滤含有指定字段的索引记录** ```http GET /ems/emp/_search { "query": { "bool": { "must": [ {"term": { "name": { "value": "中国" } }} ], "filter": { "ids": { "values": ["1","2","3"] } } } } } ``` ---