复合查询
在实际应用中,我们很有可能会过滤多个值或字段。先看一个简单的例子:
select * from persons where sex = '女' and sect = '明教';这样的多条件等值查询,就要借用到组合过滤器了,其查询语句是:{"query": {"bool": {"must": [{"term": {"sex": {"value": "女","boost": 1.0}}},{"term": {"sect.keywords": {"value": "明教","boost": 1.0}}}],"adjust_pure_negative": true,"boost": 1.0}}}
es中java是
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 构建查询语句searchSourceBuilder.query(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("sex", "女")).must(QueryBuilders.termQuery("sect.keyword", "明教")));
布尔查询
布尔过滤器(bool filter)属于复合过滤器(compound filter)的一种 ,可以接受多个其他过滤器作为参数,并将这些过滤器结合成各式各样的布尔(逻辑)组合。
- must:所有的语句都必须匹配,与 ‘=’ 等价。
- must_not:所有的语句都不能匹配,与 ‘!=’ 或 not in 等价。
- should:至少有n个语句要匹配,n由参数控制。
精度控制
所有 must 语句必须匹配,所有 must_not 语句都必须不匹配,但有多少 should 语句应该匹配呢?默认情况下,没有 should 语句是必须匹配的,只有一个例外:那就是当没有 must 语句的时候,至少有一个 should 语句必须匹配。
我们可以通过 minimum_should_match 参数控制需要匹配的 should 语句的数量,它既可以是一个绝对的数字,又可以是个百分比:
es中java是GET /person/_search{"query": {"bool": {"must": [{"term": {"sex": {"value": "女","boost": 1.0}}}],"should": [{"term": {"address.keyword": {"value": "峨眉山","boost": 1.0}}},{"term": {"sect.keyword": {"value": "明教","boost": 1.0}}}],"adjust_pure_negative": true,"minimum_should_match": "1","boost": 1.0}}}
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 构建查询语句searchSourceBuilder.query(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("sex", "女")).should(QueryBuilders.termQuery("address.word", "峨眉山")).should(QueryBuilders.termQuery("sect.keyword", "明教")).minimumShouldMatch(1));
复杂的
```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 } } }
用Java构建这个查询条件:```javaSearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 构建查询语句BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("sex", "女")).must(QueryBuilders.rangeQuery("age").gte(30).lte(40)).mustNot(QueryBuilders.termQuery("sect.keyword", "明教")).should(QueryBuilders.termQuery("address.keyword", "峨眉山")).should(QueryBuilders.rangeQuery("power.keyword").gte(50).lte(80)).minimumShouldMatch(1); // 设置should至少需要满足几个条件// 将BoolQueryBuilder构建到SearchSourceBuilder中searchSourceBuilder.query(boolQueryBuilder);
