前言
最近在测试使用ElasticSearch 7.17遇到了一些使用问题弃用了High Level REST Client,原本使用RestHighLevelClient客户端发送请求,已经移除。现使用新客户端ElasticsearchClient,网上很多高级组合检索还是老版本的,查询比较费劲,现整理一份以便使用。
简单的索引、文档以及操作请参考如下:
elasticsearch整合java使用创建索引、指定索引映射、操作添加文档、删除文档、更新文档、批量操作_java调用es创建es索引-CSDN博客
elasticsearch复杂检索,match、matchAll、matchPhrase、term、多条件查询、multiMatch多字段查询、分页查询、排序、指定查询字段查询等-CSDN博客
在我们生产使用场景中,会传入多个查询检索条件,可能是一个或者多个,可以根据自己的传入条件进行判断空null进行相应的的逻辑处理。
高级组合检索
@Test
public void seniorSearch() throws IOException {
ElasticsearchClient elasticsearchClient = elasticSearchConfig.esRestClient();
// 1动态构建出查询需要的DSL语句
// 准备检索请求
SearchRequest.Builder builder = buildSearchRequest();
SearchResponse<Object> search = elasticsearchClient.search(builder.build(), Object.class);
// 分析响应数据封装成需要的格式。
// 打印简单结果
search.hits().hits().forEach(s -> {
System.out.printf("\n" + s.source().toString());
});
}
构建需要查询的DSL
private SearchRequest.Builder buildSearchRequest() {
SearchRequest.Builder builder = new SearchRequest.Builder();
// 设置查询索引
builder.index("bank");
BoolQuery.Builder boolBuilder = new BoolQuery.Builder();
// must 模糊匹配Street
boolBuilder.must(mu->mu.match(ma->ma.field("address").query("Street")));
// 按照gender性别进行过滤
boolBuilder.filter(f->f.term(t->t.field("gender.keyword").value("M")));
// 按照年龄批量过滤
List<FieldValue> fieldValues = new ArrayList<>();
fieldValues.add(FieldValue.of(32));
fieldValues.add(FieldValue.of(33));
boolBuilder.filter(f->f.terms(t->t.field("age").terms(te->te.value(fieldValues))));
// 按照编号进行区间筛选account_number
boolBuilder.filter(f->f.range(r->r.field("account_number").gt(JsonData.of(1)).lt(JsonData.of(500))));
builder.query(q->q.bool(boolBuilder.build()));
/**
* 排序
*/
builder.sort(s->s.field(f->f.field("account_number").order(SortOrder.Asc)));
/**
* 分页
*/
builder.from(0);
builder.size(5);
/**
* 高亮
*/
builder.highlight(h->h.preTags("<span>").postTags("<span>").fields("address",hf->hf));
return builder;
}
备注:使用的数据为官方提供的数据,如有需要: