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 的集成这个章节看到。
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寅灯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值