filter查询

query和filter的区别:query查询的时候,会先比较查询条件,然后计算分值,最后返回文档结果;而filter是先判断是否满足查询条件,如果不满足会缓存查询结果(记录该文档不满足结果),满足的话,就直接缓存结果,filter不会对结果进行评分,能够提高查询效率。
filter的使用方式比较多样,下面用几个例子演示一下。

单独使用

  1. {
  2. "query": {
  3. "bool": {
  4. "filter": [
  5. {
  6. "term": {
  7. "sex": {
  8. "value": "男",
  9. "boost": 1.0
  10. }
  11. }
  12. }
  13. ],
  14. "adjust_pure_negative": true,
  15. "boost": 1.0
  16. }
  17. }
  18. }

单独使用时,filter与must基本一样,不同的是filter不计算评分,效率更高。
Java构建查询语句:

  1. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  2. // 构建查询语句
  3. searchSourceBuilder.query(QueryBuilders.boolQuery()
  4. .filter(QueryBuilders.termQuery("sex", "男"))
  5. );

和must、must_not同级,相当于子查询

  1. select * from (select * from persons where sect = '明教')) a where sex = '女';
  2. {
  3. "query": {
  4. "bool": {
  5. "must": [
  6. {
  7. "term": {
  8. "sect.keyword": {
  9. "value": "明教",
  10. "boost": 1.0
  11. }
  12. }
  13. }
  14. ],
  15. "filter": [
  16. {
  17. "term": {
  18. "sex": {
  19. "value": "女",
  20. "boost": 1.0
  21. }
  22. }
  23. }
  24. ],
  25. "adjust_pure_negative": true,
  26. "boost": 1.0
  27. }
  28. }
  29. }

es中java

  1. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  2. // 构建查询语句
  3. searchSourceBuilder.query(QueryBuilders.boolQuery()
  4. .must(QueryBuilders.termQuery("sect.keyword", "明教"))
  5. .filter(QueryBuilders.termQuery("sex", "女"))
  6. );

将must、must_not置于filter下

  1. {
  2. "query": {
  3. "bool": {
  4. "filter": [
  5. {
  6. "bool": {
  7. "must": [
  8. {
  9. "term": {
  10. "sect.keyword": {
  11. "value": "明教",
  12. "boost": 1.0
  13. }
  14. }
  15. },
  16. {
  17. "range": {
  18. "age": {
  19. "from": 20,
  20. "to": 35,
  21. "include_lower": true,
  22. "include_upper": true,
  23. "boost": 1.0
  24. }
  25. }
  26. }
  27. ],
  28. "must_not": [
  29. {
  30. "term": {
  31. "sex.keyword": {
  32. "value": "女",
  33. "boost": 1.0
  34. }
  35. }
  36. }
  37. ],
  38. "adjust_pure_negative": true,
  39. "boost": 1.0
  40. }
  41. }
  42. ],
  43. "adjust_pure_negative": true,
  44. "boost": 1.0
  45. }
  46. }
  47. }

es中java

  1. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  2. // 构建查询语句
  3. searchSourceBuilder.query(QueryBuilders.boolQuery()
  4. .filter(QueryBuilders.boolQuery()
  5. .must(QueryBuilders.termQuery("sect.keyword", "明教"))
  6. .must(QueryBuilders.rangeQuery("age").gte(20).lte(35))
  7. .mustNot(QueryBuilders.termQuery("sex.keyword", "女")))
  8. );