ElasticSearch实战系列三: ElasticSearch的JAVA API使用教程

在上一篇中介绍了ElasticSearch实战系列二: ElasticSearch的DSL语句使用教程---图文详解,本篇文章就来讲解下 ElasticSearch 6.x官方Java API的使用

ElasticSearch JAVA API

目前市面上有几种常见的ElasticSearch Java API架包,JestClient、SpringBoot整合的SpringData、Spring整合的ElasticsearchTemplate、Elasticsearch Bboss等一些开源架包,上述这些第三方整合的架包中,基本已经支持日常的使用,除了支持的ES版本会低一些而已。

本文介绍的是ElasticSearch官方的Java High Level REST Client的使用,Java High Level REST Client是ElasticSearch官方目前推荐使用的,适用于6.x以上的版本,要求JDK在1.8以上,可以很好的在大版本中进行兼容,并且该架包自身也包含Java Low Level REST Client中的方法,可以应对一些特需的情况进行特殊的处理, 它对于一些常用的方法封装Restful风格,可以直接对应操作名调用使用即可,支持同步和异步(Async)调用。

这里我们的使用也可以直接对应上一篇文章中的DSL语句使用,这样的话可以非常方便的对照和学习使用。

在对下述进行操作时,我们先来看下Elasticsearch Java High Level REST Client的初始化连接写法吧。

RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost(elasticIp, elasticPort)));

是不是很简单呢,关闭也很简单,client不为空直接close即可!

一、新增数据

ElasticSearch可以直接新增数据,只要你指定了index(索引库名称)和type(类型)即可。在新增的时候你可以自己指定主键ID,也可以不指定,由 ElasticSearch自身生成。Elasticsearch Java High Level REST Client新增数据提供了三种方法,这里我们就来看一下这三种写法吧。

新增数据代码示例一,通过jsonString进行创建:

String index = "test1"; String type = "_doc"; // 唯一编号 String id = "1"; IndexRequest request = new IndexRequest(index, type, id); String jsonString = "{" + "\"uid\":\"1234\","+ "\"phone\":\"12345678909\","+ "\"msgcode\":\"1\"," + "\"sendtime\":\"2019-03-14 01:57:04\"," + "\"message\":\"xuwujing study Elasticsearch\"" + "}"; request.source(jsonString, XContentType.JSON); IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);

新增数据代码示例二,通过map创建,会自动转换成json的数据:

String index = "test1"; String type = "_doc"; // 唯一编号 String id = "1"; IndexRequest request = new IndexRequest(index, type, id); Map<String, Object> jsonMap = new HashMap<>(); jsonMap.put("uid", 1234); jsonMap.put("phone", 12345678909L); jsonMap.put("msgcode", 1); jsonMap.put("sendtime", "2019-03-14 01:57:04"); jsonMap.put("message", "xuwujing study Elasticsearch"); request.source(jsonMap); IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);

新增数据代码示例三,通过XContentBuilder对象进行创建:

String index = "test1"; String type = "_doc"; // 唯一编号 String id = "1"; IndexRequest request = new IndexRequest(index, type, id); XContentBuilder builder = XContentFactory.jsonBuilder(); builder.startObject(); { builder.field("uid", 1234); builder.field("phone", 12345678909L); builder.field("msgcode", 1); builder.timeField("sendtime", "2019-03-14 01:57:04"); builder.field("message", "xuwujing study Elasticsearch"); } builder.endObject(); request.source(builder); IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);

上述三种方法中,个人推荐第二种,比较容易理解和使用。

二、创建索引库

在上述示例中,我们通过直接通过创建数据从而创建了索引库,但是没有创建索引库而通过ES自身生成的这种并不友好,因为它会使用默认的配置,字段结构都是text(text的数据会分词,在存储的时候也会额外的占用空间),分片和索引副本采用默认值,默认是5和1,ES的分片数在创建之后就不能修改,除非reindex,所以这里我们还是指定数据模板进行创建。
使用JAVA API 创建索引库的方法和上述中新增数据的一样,有三种方式,不过这里就只介绍一种。

新增索引库的代码示例:

private static void createIndex() throws IOException { String type = "_doc"; String index = "test1"; // setting 的值 Map<String, Object> setmapping = new HashMap<>(); // 分区数、副本数、缓存刷新时间 setmapping.put("number_of_shards", 10); setmapping.put("number_of_replicas", 1); setmapping.put("refresh_interval", "5s"); Map<String, Object> keyword = new HashMap<>(); //设置类型 keyword.put("type", "keyword"); Map<String, Object> lon = new HashMap<>(); //设置类型 lon.put("type", "long"); Map<String, Object> date = new HashMap<>(); //设置类型 date.put("type", "date"); date.put("format", "yyyy-MM-dd HH:mm:ss"); Map<String, Object> jsonMap2 = new HashMap<>(); Map<String, Object> properties = new HashMap<>(); //设置字段message信息 properties.put("uid", lon); properties.put("phone", lon); properties.put("msgcode", lon); properties.put("message", keyword); properties.put("sendtime", date); Map<String, Object> mapping = new HashMap<>(); mapping.put("properties", properties); jsonMap2.put(type, mapping); GetIndexRequest getRequest = new GetIndexRequest(); getRequest.indices(index); getRequest.local(false); getRequest.humanReadable(true); boolean exists2 = client.indices().exists(getRequest, RequestOptions.DEFAULT); //如果存在就不创建了 if(exists2) { System.out.println(index+"索引库已经存在!"); return; } // 开始创建库 CreateIndexRequest request = new CreateIndexRequest(index); try { // 加载数据类型 request.settings(setmapping); //设置mapping参数 request.mapping(type, jsonMap2); //设置别名 request.alias(new Alias("pancm_alias")); CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT); boolean falg = createIndexResponse.isAcknowledged(); if(falg){ System.out.println("创建索引库:"+index+"成功!" ); } } catch (IOException e) { e.printStackTrace(); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsppzj.html