elasticsearch系列-使用Java客户端创建索引、mapping、文档
在前两篇我们介绍了通过postman和elasticsearch-head介绍了操作elasticsearch的增删改查操作和文档的添加、修改、搜索等基本操作。在实际工作中,难免使用Java对elasticsearch进行操作,本篇我们来介绍通过Java客户端如何创建索引、mappings和文档等。
引入maven依赖
引入elasticsearch和transport依赖如下所示。
<!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.6.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.elasticsearch.client/transport -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.6.1</version>
</dependency>
elasticsearch.yml配置
在使用Java API对elasticsearch操作之前,需要在elasticsearch.yml中添加必要的配置,在elasticsearch.yml配置文件结尾处追加以下配置信息。
# elasticsearch集群名称
cluster.name: my-elasticsearch
# elasticsearch服务端口号
http.port: 9200
# 集群间通信端口号
transport.tcp.port: 9300
如果在一台物理机上存在多个elasticsearch服务实例形成一个集群,服务端口号及集群建通信端口号需要不同。
使用Java客户端操作elasticsearch
使用Java客户端创建索引
使用Java客户端创建索引库的步骤可以总结为以下几步:
- 创建一个setting对象,相当于一个配置信息,主要配置集群名称。
- 创建一个客户端client对象
- 使用client对象创建一个索引库
- 关闭client
创建代码示例如下所示。
public static void createIndex(ElasticSearchParams elasticSearchParams) throws UnknownHostException {
if (Objects.isNull(elasticSearchParams) || Strings.isNullOrEmpty(elasticSearchParams.getIndexName())
|| Strings.isNullOrEmpty(elasticSearchParams.getIp())
|| Objects.isNull(elasticSearchParams.getPort())
|| Strings.isNullOrEmpty(elasticSearchParams.getClusterName())
|| elasticSearchParams.getPort() <= 0) {
log.error("参数不合法");
}
// 创建Settings
Settings settings = Settings.builder()
.put("cluster.name", elasticSearchParams.getClusterName())
.put("client.transport.ignore_cluster_name", true)
.build();
// 创建transportclient对象
TransportClient transportClient = new PreBuiltTransportClient(settings);
transportClient.addTransportAddress(new TransportAddress(InetAddress.getByName(elasticSearchParams.getIp()), elasticSearchParams.getPort()));
transportClient.admin().indices().prepareCreate(elasticSearchParams.getIndexName())
.get();
transportClient.close();
}
在执行上述demo代码后,通过了elasticsearch-head的插件查看创建索引库的创建情况,可以发现索引库创建成功,但是存在副本,如下图所示。在创建setting对象时,如何设置索引的分片与副本数量小编暂时还没有找到方法,希望有知道的小伙伴可以加以指点。
使用Java客户端对索引设置mapping信息
使用Java客户端对索引设置mapping信息的步骤总结为以下几步:
- 创建一个settings对象
- 创建一个client对象
- 创建一个mapping信息,mapping信息为一个json数据,可以为字符串也可以使用XContextBuilder对象。
- 使用client向elasticsearch服务器发送mapping信息
- 关闭client对象
在设置mapping信息时,需要准备mapping信息,为一个json字符串,使用XContextBuilder构造json字符串,如下所示,其实就是一个json字符串的拼装,以startObject开始,endObject结束。
XContentBuilder xContentBuilder = XContentFactory.jsonBuilder()
.startObject()
.startObject("house")
.startObject("properties")
.startObject("house_id")
.field("type", "long")
.field("store", true)
.endObject()
.startObject("house_guid")
.field("type", "text")
.field("store", true)
.field("analyzer", "ik_smart")
.endObject()
.startObject("house_name")
.field("type", "text")
.field("store", true)
.field("analyzer", "ik_smart")
.endObject()
.endObject()
.endObject()
.endObject();
向elasticsearch的index中设置索引的过程如下所示。
public static boolean setMappings(ElasticSearchParams elasticSearchParams) throws IOException {
TransportClient transportClient = buildTransportClient(elasticSearchParams);
transportClient.admin().indices()
// 设置要映射的
.preparePutMapping(elasticSearchParams.getIndexName())
// 设置要映射的type
.setType("house")
.setSource(elasticSearchParams.getXContentBuilder())
.get();
return true;
}
private static TransportClient buildTransportClient(ElasticSearchParams elasticSearchParams) throws UnknownHostException {
if (Objects.isNull(elasticSearchParams) || Strings.isNullOrEmpty(elasticSearchParams.getIndexName())
|| Strings.isNullOrEmpty(elasticSearchParams.getIp())
|| Objects.isNull(elasticSearchParams.getPort())
|| Strings.isNullOrEmpty(elasticSearchParams.getClusterName())
|| elasticSearchParams.getPort() <= 0) {
log.error("参数不合法");
return null;
}
// 创建Settings
Settings settings = Settings.builder()
.put("cluster.name", elasticSearchParams.getClusterName())
.put("client.transport.ignore_cluster_name", true)
.build();
// 创建transportclient对象
TransportClient transportClient = new PreBuiltTransportClient(settings);
transportClient.addTransportAddress(new TransportAddress(InetAddress.getByName(elasticSearchParams.getIp()), elasticSearchParams.getPort()));
return transportClient;
}
执行设置mapping信息后,通过elasticsearch-head查看为索引的设置的mapping信息,可以发现设置成功,如下图所示。
使用Java客户端向索引中添加文档
在添加mapping信息后,就可以向索引中添加文档。同样添加过程可以总结为以下几步。
- 创建一个Setting对象
- 创建一个Client对象
- 创建一个文档对象,即一个json字符串,同样可以使用XContextBuilder构造json字符串
- 使用Client把文档添加到文档中
- 关闭Client对象
下面是向索引中添加文档的示例代码。
@Test
public void addDocuments() throws IOException {
ElasticSearchParams elasticSearchParams = new ElasticSearchParams();
elasticSearchParams.setIndexName("20200128-xinghaol")
.setIp("47.107.90.36")
.setClusterName("my-elasticsearch")
.setPort(9300);
TransportClient transportClient = ElasticSearchUtil.obtainTransport(elasticSearchParams);
XContentBuilder xContentBuilder = XContentFactory.jsonBuilder()
.startObject()
.field("house_id", "123456")
.field("house_guid", "lsaldlsdlflskdkfk")
.field("house_name", "elasticsearch测试房屋")
.endObject();
transportClient.prepareIndex(elasticSearchParams.getIndexName(), "house", "1")
.setSource(xContentBuilder).get();
transportClient.close();
}
获取TransportClient方式与前面创建索引、mapping时相同,运行上述demo示例后,通过elasticsearch-head插件查看对应的index中已经存在我们添加的文档,如下图所示。
小节
本篇介绍了如何通过Java客户端向elasticsearch中创建索引,指定mapping信息,添加文档,对于初学者还是有所帮助。下一篇,我们将继续介绍如何通过Java客户端查询索引中的各个信息。
最后,希望全国疫情赶快过去,一线医护人员平安归来。武汉加油、中国加油。
还没有评论,来说两句吧...