在前两篇我们介绍了通过postman和elasticsearch-head介绍了操作elasticsearch的增删改查操作和文档的添加、修改、搜索等基本操作。在实际工作中,难免使用Java对elasticsearch进行操作,本篇我们来介绍通过Java客户端如何创建索引、mappings和文档等。
引入elasticsearch和transport依赖如下所示。
org.elasticsearch
elasticsearch
6.6.1
org.elasticsearch.client
transport
6.6.1
在使用Java API对elasticsearch操作之前,需要在elasticsearch.yml中添加必要的配置,在elasticsearch.yml配置文件结尾处追加以下配置信息。
# elasticsearch集群名称
cluster.name: my-elasticsearch
# elasticsearch服务端口号
http.port: 9200
# 集群间通信端口号
transport.tcp.port: 9300
如果在一台物理机上存在多个elasticsearch服务实例形成一个集群,服务端口号及集群建通信端口号需要不同。
使用Java客户端创建索引库的步骤可以总结为以下几步:
创建代码示例如下所示。
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信息的步骤总结为以下几步:
在设置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信息,可以发现设置成功,如下图所示。
在添加mapping信息后,就可以向索引中添加文档。同样添加过程可以总结为以下几步。
下面是向索引中添加文档的示例代码。
@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客户端查询索引中的各个信息。
最后,希望全国疫情赶快过去,一线医护人员平安归来。武汉加油、中国加油。