复合查询

在实际应用中,我们很有可能会过滤多个值或字段。先看一个简单的例子:

  1. select * from persons where sex = '女' and sect = '明教';
  2. 这样的多条件等值查询,就要借用到组合过滤器了,其查询语句是:
  3. {
  4. "query": {
  5. "bool": {
  6. "must": [
  7. {
  8. "term": {
  9. "sex": {
  10. "value": "女",
  11. "boost": 1.0
  12. }
  13. }
  14. },
  15. {
  16. "term": {
  17. "sect.keywords": {
  18. "value": "明教",
  19. "boost": 1.0
  20. }
  21. }
  22. }
  23. ],
  24. "adjust_pure_negative": true,
  25. "boost": 1.0
  26. }
  27. }
  28. }

es中java是

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

布尔查询

布尔过滤器(bool filter)属于复合过滤器(compound filter)的一种 ,可以接受多个其他过滤器作为参数,并将这些过滤器结合成各式各样的布尔(逻辑)组合。
image.png

  • must:所有的语句都必须匹配,与 ‘=’ 等价。
  • must_not:所有的语句都不能匹配,与 ‘!=’ 或 not in 等价。
  • should:至少有n个语句要匹配,n由参数控制。

    精度控制

    所有 must 语句必须匹配,所有 must_not 语句都必须不匹配,但有多少 should 语句应该匹配呢?默认情况下,没有 should 语句是必须匹配的,只有一个例外:那就是当没有 must 语句的时候,至少有一个 should 语句必须匹配。
    我们可以通过 minimum_should_match 参数控制需要匹配的 should 语句的数量,它既可以是一个绝对的数字,又可以是个百分比:
    1. GET /person/_search
    2. {
    3. "query": {
    4. "bool": {
    5. "must": [
    6. {
    7. "term": {
    8. "sex": {
    9. "value": "女",
    10. "boost": 1.0
    11. }
    12. }
    13. }
    14. ],
    15. "should": [
    16. {
    17. "term": {
    18. "address.keyword": {
    19. "value": "峨眉山",
    20. "boost": 1.0
    21. }
    22. }
    23. },
    24. {
    25. "term": {
    26. "sect.keyword": {
    27. "value": "明教",
    28. "boost": 1.0
    29. }
    30. }
    31. }
    32. ],
    33. "adjust_pure_negative": true,
    34. "minimum_should_match": "1",
    35. "boost": 1.0
    36. }
    37. }
    38. }
    es中java是
    1. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    2. // 构建查询语句
    3. searchSourceBuilder.query(QueryBuilders.boolQuery()
    4. .must(QueryBuilders.termQuery("sex", "女"))
    5. .should(QueryBuilders.termQuery("address.word", "峨眉山"))
    6. .should(QueryBuilders.termQuery("sect.keyword", "明教"))
    7. .minimumShouldMatch(1)
    8. );

    复杂的

    ```java select *from personswhere sex = ‘女’and age between 30 and 40and sect != ‘明教’and (address = ‘峨眉山’ OR skill = ‘暗器’)

GET /person/_search { “query”: { “bool”: { “must”: [ { “term”: { “sex”: { “value”: “女”, “boost”: 1.0 } } }, { “range”: { “age”: { “from”: 30, “to”: 40, “include_lower”: true, “include_upper”: true, “boost”: 1.0 } } } ], “must_not”: [ { “term”: { “sect.keyword”: { “value”: “明教”, “boost”: 1.0 } } } ], “should”: [ { “term”: { “address.keyword”: { “value”: “峨眉山”, “boost”: 1.0 } } }, { “term”: { “skill.keyword”: { “value”: “暗器”, “boost”: 1.0 } } } ], “adjust_pure_negative”: true, “minimum_should_match”: “1”, “boost”: 1.0 } } }

  1. Java构建这个查询条件:
  2. ```java
  3. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  4. // 构建查询语句
  5. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
  6. .must(QueryBuilders.termQuery("sex", "女"))
  7. .must(QueryBuilders.rangeQuery("age").gte(30).lte(40))
  8. .mustNot(QueryBuilders.termQuery("sect.keyword", "明教"))
  9. .should(QueryBuilders.termQuery("address.keyword", "峨眉山"))
  10. .should(QueryBuilders.rangeQuery("power.keyword").gte(50).lte(80))
  11. .minimumShouldMatch(1); // 设置should至少需要满足几个条件
  12. // 将BoolQueryBuilder构建到SearchSourceBuilder中
  13. searchSourceBuilder.query(boolQueryBuilder);