Elastaticsearch 与spring的集成(十)
今天分析es和spring的集成实战演示:
目前常见的
Elasticsearch Java API
有四类
client
连接方式:
TransportClient
(不推荐)
,
Elasticsearch
原生的
api
,
TransportClient
可以支 持 2.x
,
5.x
版本,
TransportClient
将会在
Elasticsearch 7.0
弃用并在
8.0
中完成删 除。
RestClient
,
ES
官方推荐使用。
Jest
(不推荐)
,是
Java
社区开发的,是
Elasticsearch
的
Java Http Rest
客户 端。
Spring Data Elasticsearch
,与
Spring
生态对接,可以在
web
系统中整合到 Spring 中使用,与
SpringBoot
、
SpringData
版本容易冲突,而且往往很难跟上 Elasticsearch 版本的更新,比如
SpringBoot
目前的
2.3.1.RELEASE
,所支持 Elasticsearch 7.6.2。 从使用上来说,Spring Data
的使命是给各种数据访问提供统一的编程接口, 不管是关系型数据库(如 MySQL
),还是非关系数据库(如
Redis
),或者类似 Elasticsearch 这样的索引数据库。从而简化开发人员的代码,提高开发效率,也 就是说,Spring Data
想要把对任何数据的访问都抽象为类似接口,这就导致了 Spring Data Elasticsearch 在基本查询上没问题,但是复杂查询(模糊、通配符、 match 查询、聚集查询等)就显得力不从心了,此时,我们还是只能使用原生查 询。
所以本篇,我们把精力放在
REST Client
上,
Java REST Client
有
Low Level 和
High Level
两种:
Java Low Level REST Client
:使用该客户端需要将
HTTP
请求的
body
手动拼 成 JSON
格式,
HTTP
响应也必须将返回
JSON
数据手动封装成对象,使用上 更为原始。
Java High Level REST Client
:该客户端基于
Low Level
客户端实现,提供
API 解决 Low Level
客户端需要手动转换数据格式的问题。
ES
的官网已经提供了非常详尽的
API
参考手册,参见
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/index.ht ml
一、使用
Java Low Level REST Client,首先启动es和kibana
<dependencies> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client</artifactId> <version>7.9.0</version> </dependency> </dependencies>
代码
因为
Java Low Level REST Client
用法比较原始,在实际工作中用的比较少, 所以大概了解下用法即可,对应TestEsLowSdk
:
1
、创建访问客户端
//初始化restClient
创建客户端并连接es服务器
RestClient restClient = RestClient.builder( new HttpHost("127.0.0.1",9200,"http") ).build();
或
RestClientBuilder restClientBuilder = RestClient.builder( new HttpHost("127.0.0.1",9200,"http") ); RestClient restClient2 = restClientBuilder.build();
2
、配置访问
es
的请求
//提供谓词和终节点以及可选查询字符串等
Map<String,String> params = Collections.EMPTY_MAP; String jsonString = "{" + "\"msg\":\"Java Low Level REST Client\""+ "}"; System.out.println(jsonString); //设置请求头 以便es正确解析 HttpEntity entity = new NStringEntity(jsonString, ContentType.APPLICATION_JSON); Request request = new Request("PUT","enjoy_test/_doc/6"); request.addParameters(params); request.setEntity(entity);
3
、发送请求并接收应答
Response response = restClient.performRequest(request); System.out.println(response); System.out.println(EntityUtils.toByteArray(response.getEntity())); //关闭客户端 restClient.close();
4、运行结果成功:
二、Java High Level REST Client
Maven 配置
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.9.0</version> </dependency>
代码
对应的类是
TestEsHighSdk
1
、创建访问客户端
/*客户端的创建*/ RestClientBuilder restClientBuilder = RestClient.builder( new HttpHost("127.0.0.1",9200,"http") ); /*高level的客户端*/ RestHighLevelClient restHighLevelClient = new RestHighLevelClient(restClientBuilder);
2
、创建索引
/*创建索引*/ CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName);
//对索引字段进行设置,非必须操作
// createIndexRequest.settings(Settings.builder() // .put("index.number_of_shards",3) // .put("index.codec","best_compression"));
// Map<String,Object> message = new HashMap<>(); // message.put("type","text"); // Map<String,Object> properties = new HashMap<>(); // properties.put("message",message); // Map<String,Object> mapping = new HashMap<>(); // mapping.put("properties",properties); // createIndexRequest.mapping(mapping);
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT); System.out.println(createIndexResponse.index()); System.out.println(createIndexResponse.isAcknowledged());
使用
CreateIndexRequest
进行索引创建,如果想要对索引进行静态配置,可 以使用 request.settings
。 配置索引的映射有好几种方式,比如我们想配置的索引映射是:
put / high_sdk /_mapping
{
"properties" : {
" message " : { "type" : "text" }
}
}
可以采用:
request.mapping(
"{\n" +
" \"properties\": {\n" +
"
\"message\": {\n" +
"
\"type\": \"text\"\n" +
"
}\n" +
" }\n" +
"}",
XContentType.JSON);
也可以采用:
Map<String, Object> message = new HashMap<>();
message.put("type", "text");
Map<String, Object> properties = new HashMap<>();
properties.put("message", message);
Map<String, Object> mapping = new HashMap<>();
mapping.put("properties", properties);
request.mapping(mapping);
还可以采用:
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
{
builder.startObject("properties");
{
builder.startObject("message");
{
builder.field("type", "text");
}
builder.endObject();
}
builder.endObject();
}
builder.endObject();
request.mapping(builder);
然后通过
client.indices().create
方法将请求发送给
es
即可,
es
的应答将通过 CreateIndexResponse 返回给我们。
3
、索引
(
保存
)
文档
基本上和创建索引的思路是一样的
IndexRequest indexRequest = new IndexRequest(indexName); indexRequest.id(docId);
使用
IndexRequest
进行文档的索引,相关的请求体可以通过多种方法生成
XContentBuilder xContentBuilder = XContentFactory.jsonBuilder(); xContentBuilder.startObject(); { xContentBuilder.field("user","Mark"); xContentBuilder.timeField("postData",new Date()); xContentBuilder.field("message","Go ELK"); } xContentBuilder.endObject(); indexRequest.source(xContentBuilder); IndexResponse index = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT); System.out.println(index.getIndex()); System.out.println(index.getId());
然后通过
client.index
方法将请求发送给
es
即可,
es
的应答将通过 CreateIndexResponse 返回给我们。
4
、查询文档
使用
GetRequest
进行查询,通过
client.get
方法将请求发送给
es
即可,
es 的应答将通过 GetResponse
返回给我们。
GetRequest getRequest = new GetRequest(indexName, docId); GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT); System.out.println(" get indexname = "+getResponse.getIndex()); if(getResponse.isExists()){ System.out.println("获取的文档:"+getResponse.getSourceAsString()); }else{ System.out.println("文档不存在"); }
5、运行的结果:
更多的与检索相关的类或者方法,我们将在下篇和
SpringBoot
的集成这个章节看到。