当前位置: 首页 > 工具软件 > namesearch > 使用案例 >

Java操作Elasticsearch6实现单个字段多值匹配

戴树
2023-12-01

引言

单个字段多值匹配的意思类似mysql中某个字段的in查询,最近需求变更,需要在elasticsearch中实现多值匹配,下面总结一下几种实现的方法。

基础代码

下面是指定查询索引名称和索引类型基础代码:
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(indexName);
searchRequest.types(indexType);
SearchSourceBuilder builder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
builder.query(boolQueryBuilder);
searchRequest.source(builder);
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//查询结果
SearchHits searchHits = response.getHits();
//查询结果条数
long total = searchHits.getTotalHits();
如果对上面的代码不太熟悉,可先参考之前的博客Java操作Elasticsearch6实现基本查询

构造条件

下面以查询type字段为例,有0,1,2三种值,es中字段类型为long

方法一:QueryBuilders.termsQuery

//构造数组,初始化需要匹配的值
long[] typeArray = new long[]{0, 1};
boolQueryBuilder.filter(QueryBuilders.termsQuery("type", typeArray));
对应的sql语句为:
select * from table_name where type in (0,1);
需要注意的是这里使用的是termsQuery,而不是termQuery,使用termQuery查询会报错的。

方法二:must条件拼接,should查询多值

//构造类型查询条件
BoolQueryBuilder typeQueryBuilder = new BoolQueryBuilder();
//must连接其他条件,相当于and;should相当于or
boolQueryBuilder.must(typeQueryBuilder.should(QueryBuilders.termQuery("type", 0))
        .should(QueryBuilders.termQuery("type", 1)));
对应的sql语句为:
select * from table_name where type=1 or type =2;

方法三:mustNot反向匹配

boolQueryBuilder.mustNot(QueryBuilders.termQuery("type", 2))
要查询0和1的,只需要把2的过滤即可,可直接使用mustNot查询。
对应的sql语句为:
select * from table_name where type!=2;
而如果要查询等于2的,也可以采用多个不等条件,使用should连接
BoolQueryBuilder typeQueryBuilder = new BoolQueryBuilder();     boolQueryBuilder.mustNot(typeQueryBuilder.should(QueryBuilders.termQuery("type", 0)).should(QueryBuilders.termQuery("type", 1)));     
对应的sql语句为:
select * from table_name where type!=0 and type!=1;

总结

本篇博客主要介绍了terms多值搜索,相当于mysql中的in语句。实际应用过程,就是对elasticsearch查询语法慢慢熟悉的最好的方式。
 类似资料: