【elasticsearch8.0+】java 新版 api

1、官网API地址https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/7.17/indexing.html

2、API使用示例参考摘自[https://blog.csdn.net/qq_51553982/article/details/127738852]
3、去重查询 [https://blog.csdn.net/qq_31286957/article/details/127598644]
4、多层bool嵌套查询

查询多层嵌套
BoolQuery.Builder boolQuery = new BoolQuery.Builder();
BoolQuery subBuild = subBoolQuery.build();
subBoolQuery.must(q -> q.term(t -> t.field(fieldName).value(groupKey)));
boolQuery.must(t -> t.bool(subBuild));
SearchResponse<JSONObject> search = elasticsearchClient.search(
            builder ->builder.index(EsIndexName)
                    .query(q ->q.bool(boolQuery.build()))
                            .size(1000), JSONObject.class);
List<Hit<JSONObject>> hits = search.hits().hits();
桶聚合多层嵌套
 SearchResponse<JSONObject> response = elasticsearchClient.search(s -> s
                        .index(EsIndexName)
                        .aggregations("aAggs", t -> t.terms(f -> f.field("a").size(10000))
                                .aggregations("bAggs", tt -> tt.terms(f -> f.field("b").size(20))))
                        .size(0)
                , JSONObject.class);
结果处理:
        Buckets<StringTermsBucket> buckets = response.aggregations().get("aAggs").sterms().buckets();
        for (StringTermsBucket b : buckets.array()) {
            System.out.println(b.key()._get() + " : " + b.docCount());
            Buckets<StringTermsBucket> bAggs= b.aggregations().get("bAggs").sterms().buckets();
            for (StringTermsBucket bb : bAggs.array()) {
                System.out.println("    " + bb.key()._get() + " : " + bb.docCount());
            }
        }

5、客户端连接配置工具类

       <dependency>
            <groupId>co.elastic.clients</groupId>
            <artifactId>elasticsearch-java</artifactId>
            <version>7.17.9</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.3</version>
        </dependency>

        <dependency>
            <groupId>jakarta.json</groupId>
            <artifactId>jakarta.json-api</artifactId>
            <version>2.0.1</version>
        </dependency>
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponseInterceptor;
import org.apache.http.entity.ContentType;

import org.apache.http.message.BasicHeader;
import org.elasticsearch.client.RestClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

@Component
@Slf4j
public class ElasticSearchConfiguration {
    @Autowired
    ElasticSearchProperties elasticsearchProperties;


    @Bean()
    public ElasticsearchClient elasticsearchClient() {
        String host = elasticsearchProperties.getHost();
        String[] hosts = host.split(",");
        HttpHost[] httpHosts = new HttpHost[hosts.length];
        for (int i = 0; i < httpHosts.length; i++) {
            String h = hosts[i];
            httpHosts[i] = new HttpHost(h.split(":")[0], Integer.parseInt(h.split(":")[1]), "http");
        }
        RestClient restClient = RestClient.builder(httpHosts)
                .setHttpClientConfigCallback(httpClientBuilder
                        ->httpClientBuilder.setDefaultHeaders(
                                listOf(new BasicHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString())))
                        .addInterceptorLast((HttpResponseInterceptor) (response, context)
                                -> response.addHeader("X-Elastic-Product", "Elasticsearch"))).build();
        ElasticsearchTransport transport = new RestClientTransport(
                restClient, new JacksonJsonpMapper());
        return new ElasticsearchClient(transport);

    }
    public static <T> List<T> listOf(T... elements) {
        List<T> list = new ArrayList<>();
        for (T e : elements)
            list.add(e);
        return Collections.unmodifiableList(list);
    }
}

6、批量更新

 BulkRequest.Builder br = new BulkRequest.Builder();
 //循环处理
 for(){
	 JSONObject jsonObject = new JSONObject();
	 jsonObject.put("xxx",xxx);
	 br.operations(op -> op.update(idx -> idx.index(EsIndexName).id(id).action(a -> a
	                                .doc(jsonObject).docAsUpsert(true)
	                        ))).refresh(Refresh.True);
 }
 BulkResponse bulk = elasticsearchClient.bulk(br.build());
  1. 范围查询
      BoolQuery.Builder boolQuery = new BoolQuery.Builder();
     if (StringUtils.isNoneBlank(updateTimeStart) || StringUtils.isNoneBlank(updateTimeEnd)) {
            RangeQuery.Builder rangeQuery = new RangeQuery.Builder();
            if (StringUtils.isNoneBlank(updateTimeStart)) {
                rangeQuery.field("update_time").gte(JsonData.of(updateTimeStart));
            }
            if (StringUtils.isNoneBlank(updateTimeEnd)) {
                rangeQuery.field("update_time").lte(JsonData.of(updateTimeEnd));
            }
            boolQuery.must(t -> t.range(rangeQuery.build()));
        }

8、字段排序

        String sortField =xxx.getSort_field();//传递的排序参数
        String sortType = xxx.getSort_type();//传递的排序参数
       FieldSort.Builder sortBuilder = new FieldSort.Builder();
        if (StringUtils.isNoneBlank(sortField)) {
            sortBuilder.field(sortField);
        } else {
            sortBuilder.field("id");
        }
        if (StringUtils.isNoneBlank(sortType)) {
            if (sortType.equals("asc")) {
                sortBuilder.order(SortOrder.Asc);
            } else if (sortType.equals("desc")) {
                sortBuilder.order(SortOrder.Desc);
            }
        } else {
            sortBuilder.order(SortOrder.Asc);
        }
        SortOptions.Builder sortOptionsBuilder = new SortOptions.Builder();
        sortOptionsBuilder.field(sortBuilder.build());
        BoolQuery build = boolQuery.build();
        SortOptions buildSort = sortOptionsBuilder.build();
        log.info("查询条件: {}", build.toString());
        log.info("排序条件: {}", buildSort.toString());
        SearchResponse<JSONObject> search = elasticsearchClient.search(builder ->
                        builder.index(ES_INDEX_NAME)
                                .query(q ->
                                        q.bool(build))
                                .from(start)
                                .size(size).sort(buildSort)
                , JSONObject.class);
        List<Hit<JSONObject>> hits = search.hits().hits();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我理解你的问题是关于 Elasticsearch 8.0 Java API 中的 SearchResponse 类的使用。 SearchResponse 类是 Elasticsearch Java API 中的一个重要类,用于存储搜索请求的响应结果。可以通过该类获取搜索结果的各项信息,例如搜索结果的总数、搜索响应的状态信息以及搜索结果中的每个文档的具体信息。 在 Elasticsearch 8.0 中,可以通过以下方式创建 SearchResponse 对象: ``` SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); ``` 其中,searchRequest 是一个 SearchRequest 对象,用于定义搜索请求的具体参数,例如搜索的索引、搜索的查询语句等等。client 是 Elasticsearch 的客户端对象,通过该客户端对象可以执行各种 Elasticsearch 操作,包括搜索操作。 一旦执行搜索请求,就可以得到一个 SearchResponse 对象,可以通过该对象获取搜索结果的各项信息,例如搜索结果的总数: ``` long totalHits = response.getHits().getTotalHits().value; ``` 以上代码中,getHits() 方法返回一个 SearchHits 对象,该对象包含了所有搜索结果的详细信息。getTotalHits() 方法可以获取搜索结果的总数。value 属性可以获取具体的搜索结果总数值。 除了获取搜索结果的总数,还可以通过 SearchResponse 对象获取各个搜索结果的详细信息,例如搜索结果中第一个文档的具体信息: ``` SearchHit hit = response.getHits().getAt(0); String id = hit.getId(); String sourceAsString = hit.getSourceAsString(); ``` 以上代码中,getAt() 方法通过索引获取搜索结果中的具体文档信息。getId() 方法可以获取该文档的 ID 值,getSourceAsString() 方法可以获取该文档的具体内容。 以上是 Elasticsearch 8.0 Java API 中 SearchResponse 类的基本使用方法,希望可以帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值