filter查询
query和filter的区别:query查询的时候,会先比较查询条件,然后计算分值,最后返回文档结果;而filter是先判断是否满足查询条件,如果不满足会缓存查询结果(记录该文档不满足结果),满足的话,就直接缓存结果,filter不会对结果进行评分,能够提高查询效率。
filter的使用方式比较多样,下面用几个例子演示一下。
单独使用
{"query": {"bool": {"filter": [{"term": {"sex": {"value": "男","boost": 1.0}}}],"adjust_pure_negative": true,"boost": 1.0}}}
单独使用时,filter与must基本一样,不同的是filter不计算评分,效率更高。
Java构建查询语句:
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 构建查询语句searchSourceBuilder.query(QueryBuilders.boolQuery().filter(QueryBuilders.termQuery("sex", "男")));
和must、must_not同级,相当于子查询
select * from (select * from persons where sect = '明教')) a where sex = '女';{"query": {"bool": {"must": [{"term": {"sect.keyword": {"value": "明教","boost": 1.0}}}],"filter": [{"term": {"sex": {"value": "女","boost": 1.0}}}],"adjust_pure_negative": true,"boost": 1.0}}}
es中java
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 构建查询语句searchSourceBuilder.query(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("sect.keyword", "明教")).filter(QueryBuilders.termQuery("sex", "女")));
将must、must_not置于filter下
{"query": {"bool": {"filter": [{"bool": {"must": [{"term": {"sect.keyword": {"value": "明教","boost": 1.0}}},{"range": {"age": {"from": 20,"to": 35,"include_lower": true,"include_upper": true,"boost": 1.0}}}],"must_not": [{"term": {"sex.keyword": {"value": "女","boost": 1.0}}}],"adjust_pure_negative": true,"boost": 1.0}}],"adjust_pure_negative": true,"boost": 1.0}}}
es中java
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 构建查询语句searchSourceBuilder.query(QueryBuilders.boolQuery().filter(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("sect.keyword", "明教")).must(QueryBuilders.rangeQuery("age").gte(20).lte(35)).mustNot(QueryBuilders.termQuery("sex.keyword", "女"))));
