【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;
}
posted @   汪兔斯瑞佛  阅读(1411)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示