【ES RestHighLevelClient】API使用
1.ES提供了两个JAVA REST client 版本
Java Low Level REST Client: 低级别的REST客户端,通过http与集群交互,用户需自己编组请求JSON串,及解析响应JSON串。兼容所有ES版本。
Java High Level REST Client: 高级别的REST客户端,基于低级别的REST客户端,增加了编组请求JSON串、解析响应JSON串等相关api。使用的版本需要保持和ES服务端的版本一致,否则会有版本问题。
2.创建连接
@Override
public RestHighLevelClient elasticsearchClient() {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(username, password)); //es账号密码(默认用户名为elastic)
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost(esHost, esPort, "http"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
httpClientBuilder.disableAuthCaching();
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
}));
return client;
}
@Bean
public RestHighLevelClient esRestClient(){
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(username, password)); //es账号密码(默认用户名为elastic)
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost(esHost, esPort, "http"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
httpClientBuilder.disableAuthCaching();
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
}));
return client;
}
3.执行查询
SearchRequest 搜索请求对象
SearchSourceBuilder 搜索内容参数设置对象
SearchRequest searchRequest = new SearchRequest(); //首先创建搜索请求对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//创建搜索内容参数设置对象
searchSourceBuilder.query(boolQueryBuilder);//设置搜索条件
searchRequest.source(searchSourceBuilder);//将SearchSourceBuilder对象添加到搜索请求中
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//开始位置
sourceBuilder.from(from);
//每页数量
sourceBuilder.size(size);
//排序
sourceBuilder.sort("timeEnd", SortOrder.DESC);
//搜索请求对象
SearchRequest rq = new SearchRequest();
//索引
rq.indices(index);
//各种组合条件
rq.source(sourceBuilder);
//请求
SearchResponse rp = client().search(rq);
4.查询语句构建
4.1.构建查询语句
BoolQueryBuilder queryBuilder = boolQuery();
4.2查询条件组合关系
must: AND
mustNot: NOT
should: OR should: OR
queryBuilder.must(QueryBuilders.termQuery("user", "kimchy"))
.mustNot(QueryBuilders.termQuery("message", "nihao"))
.should(QueryBuilders.termQuery("gender", "male"));
4.3 查询子条件
matchQuery:会将搜索词分词,再与目标查询字段进行匹配,若分词中的任意一个词与目标字段匹配上,则可查询到。
termQuery:不会对搜索词进行分词处理,而是作为一个整体与目标字段进行匹配,若完全匹配,则可查询到。
4.3.1 matchAllQuery匹配所有
QueryBuilders.matchAllQuery();
4.3.2 termQuery精准匹配
QueryBuilders.termQuery("key", value)//匹配一个
QueryBuilders.termsQuery("key", obj1, obj2..) //匹配多个
4.3.3 matchPhraseQuery对中文精确匹配
QueryBuilders.matchPhraseQuery("key", value)
4.3.4 matchQuery 单个匹配(分词匹配)
QueryBuilders.matchQuery(key, value)
4.3.5 multiMatchQuery("text", "field1", "field2"..)匹配多个字段, field有通配符就行
QueryBuilders.multiMatchQuery(value, key1, key2, key3);
4.3.6 matchPhrasePrefixQuery 左前缀匹配
QueryBuilders.matchPhrasePrefixQuery(key, value);
4.3.7wildcard query 通配符查询,支持 * 任意字符串;?任意一个字符
QueryBuilders.wildcardQuery("channelCode","*ctr*")
5.一些查询例子
/**
* 精确匹配查询
*/
@GetMapping("/termQuery")
public void termQuery1(){
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.termQuery("name","新页工厂测试"));
Iterable<EsStudent> search = esStudentRepository.search(boolQueryBuilder);
}
/**
* 模糊查询
*/
@GetMapping("/likeQuery")
public void likeQuery(){
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.wildcardQuery("name","*2019*"));
Iterable<EsStudent> search = esStudentRepository.search(boolQueryBuilder);
}
/**
* 空值查询 null 或者空字符串
*/
@GetMapping("/nullQuery")
public void nullQuery(){
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//构建子查询
BoolQueryBuilder userUnitBuilder = boolQuery();
//不存在该字段
userUnitBuilder.should(QueryBuilders.boolQuery().mustNot(existsQuery("name")));
//字段为""
userUnitBuilder.should(termQuery("name", ""));
boolQueryBuilder.must(userUnitBuilder);
Iterable<EsStudent> search = esStudentRepository.search(boolQueryBuilder);
}
/**
* 字段不为空查询
*/
@GetMapping("/notNullQuery")
public void notNullQuery(){
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//构建子查询
BoolQueryBuilder userUnitBuilder = boolQuery();
//不存在该字段
userUnitBuilder.should(QueryBuilders.boolQuery().mustNot(existsQuery("name")));
//字段为""
userUnitBuilder.should(termQuery("name", ""));
boolQueryBuilder.mustNot(userUnitBuilder);
Iterable<EsStudent> search = esStudentRepository.search(boolQueryBuilder);
}
/**
* 左前缀匹配
*/
@GetMapping("/prefixQuery")
public void prefixQuery1(){
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(prefixQuery("name","新页"));
Iterable<EsStudent> search = esStudentRepository.search(boolQueryBuilder);
}
/**
* 获取数据条数
*/
@GetMapping("/countStudent")
public String countStudent() throws IOException {
// 通过CountRequest查询获得count
CountRequest countRequest = new CountRequest();
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(prefixQuery("name","新页"));
sourceBuilder.query(boolQueryBuilder);
// 绑定索引名
countRequest.indices("es_student");
countRequest.source(sourceBuilder);
CountResponse response = restHighLevelClient.count(countRequest, RequestOptions.DEFAULT);
long count=response.getCount();
return count+"";
}
/**
* 聚合统计
*/
@GetMapping("/aggStudent")
public String aggStudent() throws IOException {
SearchRequest request = new SearchRequest(STUDENT_INDEX);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(prefixQuery("name","新页"));
sourceBuilder.query(boolQueryBuilder);
ValueCountAggregationBuilder peopleNum = AggregationBuilders.count("peopleNum").field("name");
SumAggregationBuilder totalAge = AggregationBuilders.sum("totalAge").field("age");
request.source(sourceBuilder);
sourceBuilder.size(0);
request.source().aggregation(peopleNum);
request.source().aggregation(totalAge);
SearchResponse search =restHighLevelClient.search(request, RequestOptions.DEFAULT);
//统计处理结果集
Map<String, Aggregation> resultMap = search.getAggregations().asMap();
Aggregation peopleNumAgg = resultMap.get("peopleNum");
Aggregation totalAgeAgg = resultMap.get("totalAge");
double totalAgeD = ((ParsedSum) totalAgeAgg).getValue();
long peopleNumL = ((ParsedValueCount) peopleNumAgg).getValue();
return "总人数:"+peopleNumL+" 总年龄:"+totalAgeD;
}
本文来自博客园,作者:汪兔斯瑞佛,转载请注明原文链接:https://www.cnblogs.com/andywangit/p/15935974.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)