Elasitcsearch High Level Rest Client学习笔记(一) - 木子H的个人空间 - OSCHINA

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Elasitcsearch High Level Rest Client学习笔记(一) - 木子H的个人空间 - OSCHINA

一、文档

High Level Rest Client基于Low Level Rest Client工作,它的主要目的是暴露具体的api方法,以参数的形式接受请求对象并返回一个响应对象。


每一个API可以异步或同步调用,同步方法返回一个响应对象(response object);异步方法以async结尾,需要一个监听器参数(线程管理池使用的是Low Level Rest Client功能)通知相应或者接受异常。


High Level Rest Client依赖于Elasticsearch Core,可以接受 TransportClient相同请求参数和返回相同相应对象。


高级客户端需要Java 1.8并依赖于Elasticsearch core项目。 客户端版本需要与Elasticsearch版本相同。 它与TransportClient请求的参数和返回响应对象相同。

要能够与Elasticsearch进行通信,主版本号需要一致,次版本号不必相同,因为它是向前兼容的。次版本号小于等于elasticsearch的都可以。这意味着它支持与更高版本的Elasticsearch进行通信。


6.0客户端能够与任何6.x Elasticsearch节点通信,而6.1客户端肯定能够与6.1,6.2和任何后来的6.x版本进行通信,但与旧版本的Elasticsearch节点通信时可能会存在不兼容的问题,例如6.1和6.0之间,可能6.1客户端支持elasticsearch 6.0还没出来的API。


建议在将Elasticsearch集群升级到新的主要版本时升级高级客户端,因为REST API中断更改可能会导致意料之外的结果,具体取决于请求所击中的节点,以及新添加的API只能被更新的客户端版本支持。应该在群集中的所有节点都升级到新的主要版本之后,客户端才更新。


高级客户端托管在Maven Central上。所需的最低Java版本是1.8。高级客户端与Elasticsearch的发布周期相同。

添加maven依赖,版本选择相对应的elasearch版本

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>6.1.4</version>
</dependency>

任何主要版本(像beta版)的第一个版本可能都是在Lucene Snapshot版本之上构建的。在这种情况下,您将无法解析客户端的Lucene依赖关系。

例如,如果您想使用依赖于Lucene 7.0.0-snapshot-00142c9的6.0.0-beta1版本,您必须定义以下repository。

<repository>
    <id>elastic-lucene-snapshots</id>
    <name>Elastic Lucene Snapshots</name>
    <url>http://s3.amazonaws.com/download.elasticsearch.org/lucenesnapshots/00142c9</url>
    <releases><enabled>true</enabled></releases>
    <snapshots><enabled>false</enabled></snapshots>
</repository>

除此之外,还需要其他的依赖关系

  • org.elasticsearch.client:elasticsearch-rest-client
  • org.elasticsearch:elasticsearch

RestHighLevelClient实例需要Rest low-level client builder构建,代码如下

RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(
                new HttpHost("localhost", 9200, "http"),
                new HttpHost("localhost", 9201, "http")));

high-level client根据提供的builder内部创建 low-level client ,并管理其生命周期

当不再需要时,需要关闭高级客户端实例,以便它所使用的所有资源以及底层的http客户端实例及其线程得到正确释放。可以通过close方法来完成,该方法将关闭内部的RestClient实例。

client.close();

二、动手

我的es版本是5.6.3,我一开始用的restclient版本也是5.6.3,写代码过程中发现很多区别,比如创建RestHighLevelClient时5.6.3穿入的是RestClient,而6.1传入的是RestClient.Builder。5.6.3版本没有close方法,6.1有close方法,目前没去看源码,不清楚5.6.3怎么处理的使用后的资源,可能是每次使用后回收资源。

 

maven引入,目前实验最新版本6.1.4对es5.6.3还算友好,这里用的6.1.4版本

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>5.6.3</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <version>6.1.4</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>6.1.4</version>
</dependency>

创建client

final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
        //es账号密码
        new UsernamePasswordCredentials(ES_USER_NAME, ES_PWD));
try {
    client = new RestHighLevelClient(
            //传入RestClientBuilder
            RestClient.builder(
                    new HttpHost(host, port)
            ).setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                    //这里可以设置一些参数,比如cookie存储、代理等等
                    httpClientBuilder.disableAuthCaching();
                    return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                }
            }).setMaxRetryTimeoutMillis(2000)
    );
}catch (Exception e)
{
    //示例方法,不处理异常
    e.printStackTrace();
}

测试代码

GetRequest getRequest = new GetRequest("index", "log", "3");
GetResponse response = client.get(getRequest);
Map<String, Object> fields = response.getSource();
for(Map.Entry<String, Object> entry : fields.entrySet())
{
    System.out.println(entry.getKey() + ":" + entry.getValue());
}

测试结果

16bae57e32a86946~tplv-t2oaga2asx-zoom-in-crop-mark_4536_0_0_0.png

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
2月前
【Azure Logic App】使用Event Hub 连接器配置 Active Directory OAuth 认证无法成功连接到中国区Event Hub的解决之法
An exception occurred while retrieving properties for Event Hub: logicapp. Error Message: 'ClientSecretCredential authentication failed: AADSTS90002: Tenant 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' not found. Check to make sure you have the correct tenant ID and are signing into the correct cloud. Che
|
3月前
|
API 开发者
【API管理 APIM】APIM集成内部VNet后,自我访问出现(Unable to connect to the remote server)问题,而Remote Server正是APIM它自己
【API管理 APIM】APIM集成内部VNet后,自我访问出现(Unable to connect to the remote server)问题,而Remote Server正是APIM它自己
|
3月前
|
C++
【Azure Logic App】使用Event Hub 连接器配置 Active Directory OAuth 认证无法成功连接到中国区Event Hub
【Azure Logic App】使用Event Hub 连接器配置 Active Directory OAuth 认证无法成功连接到中国区Event Hub
|
3月前
|
C++
【Azure Logic App】使用Event Hub 连接器配置 Active Directory OAuth 认证无法成功连接到中国区Event Hub
在尝试使用Azure Logic App创建由Event Hub触发的工作流时,配置了Active Directory OAuth认证但仍遇到认证失败的问题。错误信息提示找不到指定的租户ID。尽管已设置了正确的Azure中国环境Authority,认证请求似乎仍指向全球Azure环境。这可能是Logic App服务本身的局限导致。作为替代方案,可采用Connection String或Managed Identity方式进行认证,两者均可正常工作。此外,通过Azure Function App复现此问题,进一步验证这是服务层面而非配置问题。相关文档和教程可在Azure官方文档中找到。
|
3月前
|
API
【Azure API 管理】解决API Management添加AAD Group时遇见的 Failed to query Azure Active Directory graph due to error 错误
【Azure API 管理】解决API Management添加AAD Group时遇见的 Failed to query Azure Active Directory graph due to error 错误
|
3月前
|
存储 API
【Azure API 管理】为调用APIM的请求启用Trace -- 调试APIM Policy的利器
【Azure API 管理】为调用APIM的请求启用Trace -- 调试APIM Policy的利器
|
3月前
|
消息中间件 API C#
【Azure API 管理】APIM添加Log-to-eventhub的策略后,一些相关APIM与Event Hub的问题
【Azure API 管理】APIM添加Log-to-eventhub的策略后,一些相关APIM与Event Hub的问题
|
3月前
|
API 数据安全/隐私保护 网络架构
【Azure API 管理】解决调用REST API操作APIM(API Management)需要认证问题(Authentication failed, The 'Authorization' header is missing)
【Azure API 管理】解决调用REST API操作APIM(API Management)需要认证问题(Authentication failed, The 'Authorization' header is missing)
|
3月前
|
JSON Go 数据格式
【Azure 环境】Notification Hub无法创建Policy : 出现 500 Internal Server Error
【Azure 环境】Notification Hub无法创建Policy : 出现 500 Internal Server Error
|
6月前
|
API Python
记录openai官网关于Setup your API key for a single project(为单个项目设置API 可以)的错误(2023/11/24)
记录openai官网关于Setup your API key for a single project(为单个项目设置API 可以)的错误(2023/11/24)
145 0