java与es8实战之三:Java API Client有关的知识点串讲

这篇具有很好参考价值的文章主要介绍了java与es8实战之三:Java API Client有关的知识点串讲。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

本篇概览

  • 本篇是《java与es8实战》系列的第三篇,将一些重要的知识点在这里梳理清楚,为后面的实践奠定基础
  • 一共有七个与Java API Client有关的重要知识点
  1. 关于namespace:每个feature都有自己的package
  2. 命名规则:介绍Java API Client中对象的方法的命名规则
  3. 集合不为空:Java API Client中对象返回的集合,到底要不要做判空?
  4. variant type:繁多的场景和对象,可以通过variant type进行简化
  5. 通过JSON字符串创建API对象:通过builder创建复杂的对象,会导致代码也很复杂,这里提供了一种更简单的方式
  6. 关于异常:有哪些异常类型,各自会在什么场景抛出
  • 接下来逐个去看

命名空间

  • 在REST API文档中,数量众多API是按照特性(feature)来分组的,如下图
    java与es8实战之三:Java API Client有关的知识点串讲

  • 在ES的Java库Java API Client中,上图中的各种feature被称为namespace

  • 在ES的Java库Java API Client中,与REST API对应的的类和接口都在统一的包名co.elastic.clients.elasticsearch之下,然后再通过下一级package进行分类,这个分类与上图的feature相对应,例如索引相关的,在REST API中的feature是Index APIs,那么在Java API Client中,完整的package就是co.elastic.clients.elasticsearch.indices,这里面有索引操作所需的请求、响应、服务等各种类,如下图
    java与es8实战之三:Java API Client有关的知识点串讲

  • 每一个namespace(也就是REST API中的feature),都有自己的client,例如索引相关的操作都有索引专用的client类负责,实例代码如下,client.indices()返回的是ElasticsearchIndicesClient对象,这是索引操作专用的实例

ElasticsearchClient client = ...
client.indices().create(c -> c.index("products"));
  • 展开上述代码的indices()方法,看看其内部实现,如下所示,每次调用indices方法,都会创建一个ElasticsearchIndicesClient对象,对于其他namespace,例如ingest、license亦是如此,都会创建新的实例
    java与es8实战之三:Java API Client有关的知识点串讲
  • 看到这里,经验丰富的您应该发现了问题:在大量并发频繁执行各种namespace操作时,会创建大量client对象,这样会影响系统性能吗?
  • es预判了咱们的预判,如下图,官方说这是轻量级对象(very lightweight),所以,理论上可以放心创建,不必担心其对系统造成的压力
    java与es8实战之三:Java API Client有关的知识点串讲
  • 尽管每个namespace都有自己的client,但也有例外,就是searchdocument,它们的代码不在search或者document这样的package下面,而是在core下面,而且可以通过ElasticsearchClient来操作,如下图
    java与es8实战之三:Java API Client有关的知识点串讲

命名规则

  • Java API Client是个库,也是个java工程,工程里有自己的内部设计,这算是Java API Client自己的框架部分(framework),另一部分就是专门为使用者提供的大量API
  • 对于API部分,方法的命名规则都是驼峰式(camelCaseNaming),例如查询请求ElasticsearchClient.search()、查询结果的最高评分SearchResponse.maxScore()
  • 对于framework部分,方法命令是下划线作为前缀,例如获取查询类型Query._kind()

五种对象

  • 官方将Java API Client中的对象分为五种
  1. Object mapper:序列化和反序列化工具,这类对象是线程安全、无状态的,通常是单例模式存在于应用中,常在启动时创建
  2. Transport:传输工具,此类对象线程安全,借助底层HTTP客户端工具维护着网络资源,例如负责与es服务端建立连接,在需要关闭连接的时候负责释放所有底层网络资源
  3. Clients:实际处理每个namespace的客户端类,例如负责索引的是ElasticsearchIndicesClient,它们的特点:不可变对象、无状态、线程安全、轻量级(类似于普通bean的资源开销),之所以轻量级,是因为其结构实际上就是对一些API endpoint的包装
  4. Builders:这个在《开篇》中已经详细说明了,就不多赘述,用过builder的您应该会发现,builder当然是可变类,至于是否线程安全似乎和builder没什么关系,因为每创建一次实例时,都要创建一个builder实例,而且,一旦执行完build方法后,这个builder实例就没用了
  5. Requests & other API objects:和请求相关的对象,都是不可变的、线程安全的

集合不会为空

  • 对于单值属性,我们在使用的时候判断是否为空是个常规操作,这样是为了避免直接使用时可能出现的空指针异常
  • 而对于集合,Java API Client 已经确保了API返回的集合非空,我们只需要检查集合中是否有内容,而不必担心集合自身是否等于null的问题,官方给出的演示代码如下
NodeStatistics stats = NodeStatistics.of(b -> b
    .total(1)
    .failed(0)
    .successful(1)
);

// The `failures` list was not provided.
// - it's not null
assertNotNull(stats.failures());
  • 出于好奇,去看看NodeStatistics源码,构造方法如下,failures来自ApiTypeHelper.unmodifiable
	private NodeStatistics(Builder builder) {

		this.failures = ApiTypeHelper.unmodifiable(builder.failures);
		this.total = ApiTypeHelper.requireNonNull(builder.total, this, "total");
		this.successful = ApiTypeHelper.requireNonNull(builder.successful, this, "successful");
		this.failed = ApiTypeHelper.requireNonNull(builder.failed, this, "failed");

	}
  • 再去看ApiTypeHelper.unmodifiable,如下,已确保了failures不为空
    public static <T> List<T> unmodifiable(@Nullable List<T> list) {
        if (list == null) {
            return undefinedList();
        }
        if (list == UNDEFINED_LIST) {
            return list;
        }
        return Collections.unmodifiableList(list);
    }
  • 因此,再使用API返回的集合时,集合对象自身始终非空

variant type

  • variant type是Java API Client中常见的对象类型,这个该如何翻译呢,个人觉得是不确定类型的意思,不专业,期待您的指正
  • 举个例子,查询是最常见的操作了,下面列举三种查询,第一个是普通的不分词查询
{
  "query":{"term":{ "interests":"youyong"}}
}
  • 分词查询
{
  "query":{"match":{"interests": "changge"}}
}
  • 以及复杂的全文本查询
{
  "query": {
    "intervals" : {
      "my_text" : {
        "all_of" : {
          "ordered" : false,
          "intervals" : [
            {
              "match" : {
                "query" : "my favorite books",
                "max_gaps" : 0,
                "ordered" : true
              }
            },
            {
              "any_of" : {
                "intervals" : [
                  { "match" : { "query" : "java tutorials" } },
                  { "match" : { "query" : "cold porridge" } }
                ]
              }
            }
          ]
        }
      }
    }
  }
}
  • 对查询来说,在Java API Client中,有个Query对象代表了查询行为,这就是个典型的variant type,至于对应的真实query是哪种,可以在builder时指定,例如下面指定了类型是term
Query query = new Query.Builder()
    .term(t -> t                          
        .field("name")                    
        .value(v -> v.stringValue("foo"))
    )
    .build();  
  • 上述query有对应的方法返回其值,例如上面的value可以这样获取
query.term().value().stringValue()
  • 如果在设置的时候,并非用stringValue方法,而是其他类型,那么上面的代码在获取String类型的值时会抛出IllegalStateException异常

  • variant type配有对应的isXXX方法返回其是否属于某个类型,例如Query就有query.isTerm()表示自己是不是term查询

  • 还可以用_kind()返回当前类型,下面是示例

switch(query._kind()) { 
    case Term:
        doSomething(query.term());
        break;
    case Intervals:
        doSomething(query.intervals());
        break;
    default:
        doSomething(query._kind(), query._get()); 
}
  • 可见有了variant type,在 queries, aggregations, field mappings, analyzers等多种场景下,我们不需要使用各种具体的类,只要用最抽象的variant type,再配置builder pattern即可,这对服务提供者和服务消费者都是有效的简化

通过JSON字符串创建API对象

  • 下面是kibana页面上,用JSON创建索引的操作截图
    java与es8实战之三:Java API Client有关的知识点串讲
  • 如果要在代码中实现上述效果,该如何做呢?一层一层的创建mapping、proterties、field对象?那可真是麻烦...
  • 在Java API Client中,可以通过json字符串反序列化为API对象,首先,将上述JSON放入名为some-index.json的文件中,然后执行以下代码,即可用json文件创建req对象
InputStream input = this.getClass()
    .getResourceAsStream("some-index.json"); 

CreateIndexRequest req = CreateIndexRequest.of(b -> b
    .index("some-index")
    .withJson(input) 
);

boolean created = client.indices().create(req).acknowledged();
  • 再来段更复杂的,一个API对象,既通过JSON反序列化生成,同时又能调用对象的方法设置一些属性
Reader queryJson = new StringReader(
    "{" +
    "  \"query\": {" +
    "    \"range\": {" +
    "      \"@timestamp\": {" +
    "        \"gt\": \"now-1w\"" +
    "      }" +
    "    }" +
    "  }," +
    "  \"size\": 100" + 
    "}");

Reader aggregationJson = new StringReader(
    "{" +
    "  \"size\": 0, " + 
    "  \"aggregations\": {" +
    "    \"hours\": {" +
    "      \"date_histogram\": {" +
    "        \"field\": \"@timestamp\"," +
    "        \"interval\": \"hour\"" +
    "      }," +
    "      \"aggregations\": {" +
    "        \"max-cpu\": {" +
    "          \"max\": {" +
    "            \"field\": \"host.cpu.usage\"" +
    "          }" +
    "        }" +
    "      }" +
    "    }" +
    "  }" +
    "}");

SearchRequest aggRequest = SearchRequest.of(b -> b
    .withJson(queryJson) 
    .withJson(aggregationJson) 
    .ignoreUnavailable(true) 
);

Map<String, Aggregate> aggs = client
    .search(aggRequest, Void.class)
    .aggregations();

关于异常

  • 在Java API Client中一共有两大类异常
  1. 第一类是由es服务端返回的错误引发的,例如es服务端的校验未通过,或者es服务端自己内部出现异常等,这些情况下抛出的异常是ElasticsearchException
  2. 第二类是因为请求未能成功到达es服务端而引发的,例如网络故障,es服务不可用等,这些情况下抛出的异常是TransportException,这些是lower-level implementation抛出的,有个例外:如果这些问题发生在RestClientTransport对象的方法中,那么抛出的异常类型是ResponseException
  • 以上就是Java API Client相关的重要知识点,在写代码之前先了解它们算是打好基础,然后,接下来精彩的实战篇即将开幕

欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...文章来源地址https://www.toymoban.com/news/detail-677169.html

到了这里,关于java与es8实战之三:Java API Client有关的知识点串讲的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • ES8 向量搜索(knn-search)java-api 实践

    官方文档-knn-search kNN搜索 k-nearest neighbor (kNN)搜索找到与查询向量最近的k个向量,如通过相似度计算。 kNN的常见用例包括: 基于自然语言处理(NLP)算法的相关性排序 产品推荐和推荐引擎 图像或视频的相似性搜索 要运行kNN搜索,您必须能够将数据转换为有意义的向量值

    2024年02月12日
    浏览(46)
  • java与es8实战之一:以builder pattern开篇

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 《java与es8实战》系列是欣宸与2022年夏季推出的原创系列,如标题所述,该系列从一个java程序员视角去学习和实践elasticsearch的8.2版本,目标是与大家一起掌握与elasticsearch开发相关的技能,以应对实

    2024年02月11日
    浏览(38)
  • java与es8实战之六:用JSON创建请求对象(比builder pattern更加直观简洁)

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本文是《java与es8实战》系列的第六篇,经过前面的实战,咱们初步掌握了一些Java对ES的基本操作,通过发送请求对象(例如CreateIndexResponse)到ES服务端,达到操作ES的目的,但是细心的您可能发现了:

    2024年02月10日
    浏览(42)
  • ES搜索引擎入门+最佳实践(九):项目实战(二)--elasticsearch java api 进行数据增删改查

            本篇是这个系列的最后一篇了,在这之前可以先看看前面的内容: ES搜索引擎入门+最佳实践(一)_flame.liu的博客-CSDN博客 ES搜索引擎入门+最佳实践(二)_flame.liu的博客-CSDN博客 ES搜索引擎入门+最佳实践(三)_flame.liu的博客-CSDN博客 ES搜索引擎入门+最佳实践(四)_flame.liu的博客

    2024年02月12日
    浏览(59)
  • docker安装es8.x及elasticSearch8部分api使用

    docker中安装es8 1、es8的tar下载地址: tar包下载地址) 2、docker load -i es-name 3、docker run -d --name elasticsearch-8.6.2 -e ES_JAVA_OPTS=“-Xms256m -Xmx256m” -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” elasticsearch:8.6.2 4、8开始以后不支持直接使用http方式访问es: 4.1、cd /usr/share/elasticsearch/config 4

    2024年02月12日
    浏览(48)
  • Java版人脸跟踪三部曲之三:编码实战

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 作为《Java版人脸跟踪三部曲》系列的终篇,本文会与大家一起写出完整的人脸跟踪应用代码 前文《开发设计》中,已经对人脸跟踪的核心技术、应用主流程、异常处理等方方面面做了详细设计,建

    2024年02月12日
    浏览(38)
  • Elasticsearch:从 Java High Level Rest Client 切换到新的 Java API Client

    作者:David Pilato 我经常在讨论中看到与 Java API 客户端使用相关的问题。 为此,我在 2019 年启动了一个 GitHub 存储库,以提供一些实际有效的代码示例并回答社区提出的问题。 从那时起,高级 Rest 客户端 (High Level Rest Cliet - HLRC) 已被弃用,并且新的 Java API 客户端已发布。 为了

    2024年03月19日
    浏览(50)
  • ES的两种认证登录方式: JAVA REST Client/HTTP Client

    通过RestHighLevelClient发送的es请求验证方式: 通过http直接发送的es请求认证方式:

    2024年02月16日
    浏览(38)
  • ElasticSearch系列——Elasticsearch Java API Client

    这是用于Elasticsearch的官方Java API客户端的文档。客户端为所有Elasticsearch API提供强类型请求和响应。我们要注意原来的HighRestAPIClient以及停用了,这是趋势,包括SpringData-ElasticSearch4.4.5之后配合ES8的推出也会更换 https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/7.17/indexing.html

    2024年02月01日
    浏览(43)
  • Elasticsearch 7.17 Java Client Api

    Elasticsearch官方建议使用新版的Java Api Client替代原有的Rest客户端,这篇文章会简单讲解 新版api的使用。 The Elasticsearch Java API Client is an entirely new client library that has no relation to the older High Level Rest Client (HLRC). This was a deliberate choice to provide a library that is independent from the Elasticsearc

    2024年02月11日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包