ElasticSearch系列——Elasticsearch Java API Client
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
特点
- 所有Elasticsearch API的强类型请求和响应。
- 所有API的阻塞和异步版本。
- 使用流畅的构建器和函数模式,在创建复杂的嵌套结构时,允许编写简洁但可读的代码
- 通过使用对象映射器(如杰克逊或任何JSON-B实现)无缝集成应用程序类。
- 将协议处理委托给http客户端(如Java低级REST客户端),该客户端负责处理所有传输级问题:HTTP连接池、重试、节点发现等。
需求
- Java11版本
- 一 个 JSON 对象映射库,允许您的应用程序类与Elasticsearch API无缝集成 ,Java 客户端支持 Jackson 或 JSON-B 库 ( 如 Eclipse Yasson )
核心三大组成
Java API客户端由三个主要组件构成:
- API client classes(API客户端类)。它们为Elasticsearch API提供了强类型数据结构和方法。由于Elasticsearch API很大,它以特性组(也称为“命名空间”)的形式进行结构化,每个特性组都有自己的客户端类。Elasticsearch核心功能在ElasticsearchClient类中实现。
- A JSON object mapper(JSON对象映射器):这将应用程序类映射到JSON,并将它们与API客户机无缝集成。
- A transport layer implementation(一种传输层实现):这是所有HTTP请求处理发生的地方。
包和命名空间
Elasticsearch API很大,并被组织成功能组,这可以在Elasticsearch API文档中看到。
Java API客户端遵循以下结构:特征组被称为“命名空间”,并且每个命名空间位于co.elastic.clients.elasticsearch
的子包中。
每个命名空间客户端都可以从顶级Elasticsearch客户端访问。唯一的例外是“search”和“document”API,它们位于核心子包中,可以在主Elasticsearch客户端对象上访问。
QuickStart
1.导入依赖
这里记住你的elasticsearch-java
必须对应你电脑上装的ES版本
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>7.17.6</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>
2.开启连接
//创建一个低级的客户端
final RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
//创建JSON对象映射器
final RestClientTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
//创建API客户端
final ElasticsearchClient client = new ElasticsearchClient(transport);
3.关闭连接
client.shutdown();
transport.close();
restClient.close();
完整代码
public class Client {
public static void main(String[] args) throws IOException {
//创建一个低级的客户端
final RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
//创建JSON对象映射器
final RestClientTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
//创建API客户端
final ElasticsearchClient client = new ElasticsearchClient(transport);
//查询所有索引-------------------------------------------------------------------------------------
final GetIndexResponse response = client.indices().get(query -> query.index("_all"));
final IndexState products = response.result().get("products");
System.out.println(products.toString());
//关闭
client.shutdown();
transport.close();
restClient.close();
}
}
@JsonIgnore注解
标记注释,指示访问器(字段、getter/setter方法或[JsonCreator带注释的构造函数或工厂方法]的Creator参数)的逻辑属性将被基于内省的序列化和反序列化功能忽略。
上面是官方的解释,在我们的ES API中这个注解用于在实体类上的某个属性进行添加,用于忽略这个属性,即使用该注解标注的属性在查询时会被输出为null
(前提是你设置了映射含有,若本来就没有映射,则不会看到这个属性),而在创建时则会直接忽略
例如:
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Produce {
@JsonIgnore
private String sku;
private String name;
private String des;
private double price;
}
我们在sku上添加了这个注解,那么创建文档时就不会有这个属性(请大家运行以下代码进行验证即可),一般我们在真实业务中也会这样做,因为文档的_id
字段会与之重合导致不必要的数据冗余
public class CreateDocClass {
public static void main(String[] args) throws IOException {
final RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
final RestClientTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
final ElasticsearchClient client = new ElasticsearchClient(transport);
//创建文档
final Produce produce = new Produce("aabbcc555", "旺仔牛比糖", "旺仔牛比糖吃了炒鸡牛笔", 6.66D);
final IndexResponse response = client.index(builder -> builder.index("produces").id(produce.getSku()).document(produce));
System.err.println(response.version());
client.shutdown();
transport.close();
restClient.close();
}
}
JsonData类
原始JSON值。可以使用JsonpMapper将其转换为JSON节点树或任意对象。 此类型在API类型中用于没有静态定义类型或无法表示为封闭数据结构的泛型参数的值。 API客户端返回的此类实例保留对客户端的JsonpMapper的引用,并且可以使用to(class)转换为任意类型,而不需要显式映射器
我们一般在ES的DSL范围查询中会使用到!
核心方法:
- to:将此对象转换为目标类。必须在创建时提供映射器
- from:从读取器创建原始JSON值
- of:从现有对象创建原始JSON值,以及用于进一步转换的映射器
- deserialize:使用反序列化程序转换此对象。必须在创建时提供映射器
这个类不多大家自己看一下应该就知道怎么用了,位于package co.elastic.clients.json;
下
API使用
以下所有API和我之前的文章对应请查看:ElasticSearch系列——Kibana,核心概念的使用Kibana对ES进行操作部分
开启连接
- 构建RestClient低级客户端
- 构建对象映射器
- 构建ES的API客户端
final RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
final RestClientTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
final ElasticsearchClient client = new ElasticsearchClient(transport);
关闭连接
对应开启
- 关闭ES的API客户端
- 关闭对象映射器
- 关闭低级客户端
client.shutdown();
transport.close();
restClient.close();
查询所有索引
indices是index的复数
其实看起来很好理解
使用GET方法进行查询index
查询所有的就是GET http://localhost:9200/_all
//省略连接...
final GetIndexResponse all = client.indices().get