elasticsearch搜索条件
1.组合条件
- filter:过滤条件
- must:and
- should: OR
- mustNot:not
2.查询QueryBuilders
2.1 完全匹配(termQuery、termsQuery)
QueryBuilders.termQuery(key, value) //一个key匹配一个值,完全匹配
QueryBuilders.termsQuery(key, value1, value2..) //一个key匹配多个值
2.2 单字段匹配(matchQuery)
QueryBuilders.matchQuery(key, value)
2.3 多字段匹配(multiMatchQuery)
QueryBuilders.multiMatchQuery(value, key1, key2, key3..)
2.4 字段分词匹配(matchPhraseQuery 必须在分词中都包含,而且顺序相同,默认必须都是连续的)
QueryBuilders.matchPhraseQuery(key, value)
2.5 模糊查询(wildcardQuery) ?匹配单个字符,*匹配多个字符
QueryBuilders.wildcardQuery(key, "*手机?")
2.6 范围查询(rangeQuery) from:相当于闭区间,to:开区间; gt:相当于开区间(>),gte:相当于闭区间 (>=),lt:开区间(<),lte:闭区间 (<=)
QueryBuilders.rangeQuery(key).from(value1).to(vaule2)
QueryBuilders.rangeQuery(key).gte(value)
2.7 子查询 (nestedQuery)
QueryBuilders.nestedQuery("key1",
QueryBuilders.matchPhraseQuery("key1.key2", value),
ScoreMode.Max))
3.构建查询条件
BoolQueryBuilder builder = QueryBuilders.boolQuery();
builder.filter(QueryBuilders.termQuery("state", 1))
.must(QueryBuilders.multiMatchQuery("浮光", "name", "nick_name"))
.should(QueryBuilders.matchQuery("sex", 1))
.mustNot(QueryBuilders.rangeQuery("age").gte(25))
//专辑名,简介或者专辑标签中查询,标签是内部对象数组格式 labels:[{"name":""},{"name":""}]
BoolQueryBuilder albumBuilder = QueryBuilders.boolQuery();
BoolQueryBuilder albumQuery = QueryBuilders.boolQuery();
albumQuery.should(QueryBuilders.multiMatchQuery("专辑1", "name", "introduce")
.analyzer("ik_max_word")
.operator(Operator.OR);)
.should(QueryBuilders.nestedQuery("labels",
QueryBuilders.matchPhraseQuery("labels.name", key),
ScoreMode.Max));
albumBuilder.must(albumQuery);
3.1 ScoreMode枚举
- Avg:父命中的分数是所有子分数的平均值
- Max:父命中的分数是所有子分数的最大值
- Min:父命中的分数是所有子分数的最小值
- None:不得分
- Total:父命中的分数是所有子分数的总和