Elasticsearch Java API Client 8.x使用方式

这篇具有很好参考价值的文章主要介绍了Elasticsearch Java API Client 8.x使用方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

客户端的变化

众所周知,Elasticsearch是基于Lucene的,提供了更高层次的封装、分布式方面的扩展,以及REST API来方便使用,我们先来看看java client的变化:

Elasticsearch Java API Client 8.x使用方式
从图中可以看成,在8.x版本中,Elasticsearch提供了全新的Java API Client,用来代替之前广为使用的High Level Client,根据官网说法两者并无关联;而更具有灵活性和偏向底层的Low Level Client依旧在迭代,提供给用户更多的选择。

快速开始

话不多说,直接开始,Java API Client依赖于JSON来进行数据格式化,支持Jackson或者JSON-B库,引入相应maven依赖。

<dependency>
  <groupId>co.elastic.clients</groupId>
	<artifactId>elasticsearch-java</artifactId>
	<version>8.6.2</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>

下一步连接Elasticsearch服务端:

@Component
public class ElasticsearchConfig {

    @Bean
    public ElasticsearchClient elasticsearchClient(){
        BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password));

        RestClient httpClient = RestClient.builder(new HttpHost(hostName, port))
            .setHttpClientConfigCallback(hc -> hc.setDefaultCredentialsProvider(credentialsProvider))
            .build();

        ElasticsearchTransport transport = new RestClientTransport(httpClient, new JacksonJsonpMapper());
        return new ElasticsearchClient(transport);
    }
}

在这里创建的是一个同步的客户端,Java API Client还支持创建异步的客户端:ElasticsearchAsyncClient,返回的是一个标准的 CompletableFuture,按需选择。另外我们还可以看到,创建对象时使用了构造器模式,以及lambda表达式,这两种方式使得代码更加简洁和高效。

JakartaEE

补充一点额外内容,JSON-B库的全称是Jakarta JSON Binding,是用于Java对象与JSON消息相互转换的标准绑定层,来源于Jakarta EE。
而Jakarta EE并不是什么新鲜技术,它的前身是Java EE。之所以改名称,是因为2017年Oracle宣布开源Java EE并将项目移交给Eclipse基金会时,提出来的要求,导致改名事件。现阶段一般都在使用类似于SpringBoot的框架,Java EE的存在感就更弱了,这里就不再扩展了。

写入文档

Java API Client支持写入bean对象,或者直接写入JSON格式数据,其中bean对象会被自动映射为JSON。

public void index() throws IOException {
    Order order = new Order(1L, "test product", 233L);

    IndexRequest<Order> request = IndexRequest.of(i -> i
        .index("order-index")
        .id(String.valueOf(order.getId()))
        .document(order)
        .version(1L)
    );

    IndexResponse indexResponse = elasticsearchClient.index(request);
    log.info("indexResponse:{}", indexResponse.toString());
}

构建一个order对象后,使用其ID作为主键,写入到名为"order-index"的索引之中,同时通过version参数指定了数据版本号,来进行并发控制。

搜索文档

以产品名称、价格作为搜索条件,来看看具体的实现:

public void search() throws IOException {
    String keyword = "apple";
    Long maxPrice = 100L;

    Query byProduct = MatchQuery.of(m -> m
        .field("product")
        .query(keyword)
    )._toQuery();

    Query byMaxPrice = RangeQuery.of(r -> r
        .field("price")
        .gte(JsonData.of(maxPrice))
    )._toQuery();
    
    SortOptions sortOptions = SortOptions.of(s -> s
        .field(FieldSort.of(f->f
            .field("id")
            .order(SortOrder.Desc))
        )
    );

    SearchResponse<Order> response = elasticsearchClient.search(s -> s
        .index("order-index")
        .query(q -> q
            .bool(b -> b
                .must(byProduct)
                .must(byMaxPrice)
            )
        )
        .from(0)
        .size(10), 
        Order.class
    );

    List<Hit<Order>> hits = response.hits().hits();
    hits.forEach(hit -> {
        Order order = hit.source();
        List<FieldValue> sortList = hit.sort();
    });
}

深度分页

在搜索文档的实现中,指定了from和size参数,目的的为了实现分页效果;其中from是游标位置,size是返回数据量大小,类似于MySQL的limit功能。当from过大时Elasticsearch会返回一个错误:
Result window is too large, from + size must be less than or equal to: [10000]

分析这个错误,需要从搜索的实现原理来入手。在客户端请求到达协调节点后,会从各个分片的数据节点获取数据,因为数据分布不均匀的关系,例如在查询第2页的10条数据时,需要从每个节点都获取20条数据,进行排序来避免数据遗漏。

Elasticsearch Java API Client 8.x使用方式

在之前的版本中,Elasticsearch经常会出现的一个问题是查询1W条以后的数据会非常慢,也就是因为这个原因,解决办法是使用Scroll API,使用快照的思路实现。在最新版中,这种方式已经不再推荐使用,取而待之的是search_after参数和point in time (PIT)结合使用。

elasticsearchClient.search(s -> s
    .index("order-index")
    .searchAfter(FieldValue.of(1878133432))
    .sort(sortOptions)
    .size(20),
    Order.class
);

聚合功能

Elasticsearch中聚合常见的应用场景是实现类似于MySQL的sum、count、group by功能,来看一个多参数group by的实现。文章来源地址https://www.toymoban.com/news/detail-465874.html

public void aggregation() throws IOException {
    MultiTermsAggregation aggregation = MultiTermsAggregation.of(s -> s.terms(
        MultiTermLookup.of(t->t.field("product")),
        MultiTermLookup.of(t->t.field("user"))
    ));

    Aggregation priceAggregation = Aggregation.of(s -> s.sum(AggregationBuilders.sum().field("price").build()));
    Aggregation idAggregation = Aggregation.of(s -> s.valueCount(ValueCountAggregation.of(v -> v.field("id"))));

    Aggregation aggs = Aggregation.of(s -> s
        .multiTerms(aggregation)
        .aggregations("price", priceAggregation)
        .aggregations("id", idAggregation)
    );

    SearchRequest searchRequest = new SearchRequest.Builder()
        .index("order-index")
        .aggregations("aggs", aggs)
        .build();
    SearchResponse<Void> searchResponse = elasticsearchClient.search(searchRequest, Void.class);
    Aggregate aggregate = searchResponse.aggregations().get("aggs");
    Buckets<MultiTermsBucket> buckets = aggregate.multiTerms().buckets();
    buckets.array().forEach(bu -> {
        String product = bu.key().get(0).stringValue();
        String user = bu.key().get(1).stringValue();

        double totalPrice = bu.aggregations().get("price").sum().value();;
        double totalNum = bu.aggregations().get("id").valueCount().value();
    });
}

到了这里,关于Elasticsearch Java API Client 8.x使用方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • NexNoSQL Client:Elasticsearch、Redis、MongoDB三合一的可视化客户端管理工具

    工作中我们使用了Elasticsearch作为存储,来支持内容的搜索,Elasticsearch这个软件大家都耳熟能详,它是一个分布式、高扩展、高实时的搜索与数据分析引擎,不仅仅支持文本索引,还支持聚合操作,使用它既可以做数据搜索,还可以做报表分析,非常的方便。 在使用过程中我

    2024年02月15日
    浏览(98)
  • Java常用的Http client客户端

    Apache HttpClient是一个开源的Java HTTP客户端库,具有丰富的功能集,包括自动重试、连接管理、cookie管理、代理支持和认证等。HttpClient已成为Java开发中广泛使用的HTTP客户端之一。 OkHttp是Square公司开发的一个高性能的HTTP客户端库,具有自动重试、连接池、交互式调试和压缩支持

    2024年02月08日
    浏览(33)
  • 使用Kafka客户端(spring-kafka)的Java API操作Kafka的Topic

    记录 :458 场景 :在Spring Boot微服务集成Kafka客户端spring-kafka-2.8.2操作Kafka的Topic的创建和删除。 版本 :JDK 1.8,Spring Boot 2.6.3,kafka_2.12-2.8.0,spring-kafka-2.8.2。 Kafka安装 :https://blog.csdn.net/zhangbeizhen18/article/details/129071395 1.微服务中 配置Kafka信息 1.1在pom.xml添加依赖 pom.xml文件: 解析

    2024年02月09日
    浏览(32)
  • 使用Kafka客户端(kafka-clients)的Java API操作Kafka的Topic

    记录 :460 场景 :在Spring Boot微服务集成Kafka客户端kafka-clients-3.0.0操作Kafka的Topic的创建和删除。 版本 :JDK 1.8,Spring Boot 2.6.3,kafka_2.12-2.8.0,kafka-clients-3.0.0。 Kafka安装 :https://blog.csdn.net/zhangbeizhen18/article/details/129071395 1.微服务中 配置Kafka信息 1.1在pom.xml添加依赖 pom.xml文件: 解析

    2024年02月09日
    浏览(52)
  • SpringBoot集成Elasticsearch8.x(6)|(新版本Java API Client使用)

    章节 章节 第一章链接: SpringBoot集成Elasticsearch7.x(1)|(增删改查功能实现) 第二章链接: SpringBoot集成Elasticsearch7.x(2)|(复杂查询) 第三章链接: SpringBoot集成Elasticsearch7.x(3)|(aggregations之指标聚合查询) 第四章链接: SpringBoot集成Elasticsearch7.x(4)|(aggregations之分桶聚合

    2024年02月08日
    浏览(38)
  • Java【网络编程2】使用 TCP 的 Socket API 实现客户端服务器通信(保姆级教学, 附代码)

    📕各位读者好, 我是小陈, 这是我的个人主页 📗小陈还在持续努力学习编程, 努力通过博客输出所学知识 📘如果本篇对你有帮助, 烦请点赞关注支持一波, 感激不尽 📙 希望我的专栏能够帮助到你: JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统

    2024年02月05日
    浏览(45)
  • # SpringBoot集成Elasticsearch8.5.x(5)|( 新版本Java API Client使用)

    章节 章节 第一章链接: SpringBoot集成Elasticsearch7.x(1)|(增删改查功能实现) 第二章链接: SpringBoot集成Elasticsearch7.x(2)|(复杂查询) 第三章链接: SpringBoot集成Elasticsearch7.x(3)|(aggregations之指标聚合查询) 第四章链接: SpringBoot集成Elasticsearch7.x(4)|(aggregations之分桶聚合

    2023年04月13日
    浏览(37)
  • 【ElasticSearch】使用 Java 客户端 RestClient 实现对文档的查询操作,以及对搜索结果的排序、分页、高亮处理

    在 Elasticsearch 中,通过 RestAPI 进行 DSL 查询语句的构建通常是通过 HighLevelRestClient 中的 resource() 方法来实现的。该方法包含了查询、排序、分页、高亮等所有功能,为构建复杂的查询提供了便捷的接口。 RestAPI 中构建查询条件的核心部分是由一个名为 QueryBuilders 的工具类提供

    2024年01月16日
    浏览(51)
  • SpringBoot集成Elasticsearch8.x(7)|(新版本Java API Client使用完整示例)

    章节 第一章链接: SpringBoot集成Elasticsearch7.x(1)|(增删改查功能实现) 第二章链接: SpringBoot集成Elasticsearch7.x(2)|(复杂查询) 第三章链接: SpringBoot集成Elasticsearch7.x(3)|(aggregations之指标聚合查询) 第四章链接: SpringBoot集成Elasticsearch7.x(4)|(aggregations之分桶聚合查询)

    2024年02月16日
    浏览(48)
  • 基于 SpringBoot 2.7.x 使用最新的 Elasticsearch Java API Client 之 ElasticsearchClient

    从 Java Rest Client 7.15.0 版本开始,Elasticsearch 官方决定将 RestHighLevelClient 标记为废弃的,并推荐使用新的 Java API Client,即 ElasticsearchClient. 为什么要将 RestHighLevelClient 废弃,大概有以下几点: 维护成本高 :RestHighLevelClient 需要和 Elasticsearch APIs 的更新保持一致,而 Elasticsearch A

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包