elasticsearch系列-使用Java客户端创建索引、mapping、文档

爱被打了一巴掌 2023-07-02 15:27 74阅读 0赞

在前两篇我们介绍了通过postman和elasticsearch-head介绍了操作elasticsearch的增删改查操作和文档的添加、修改、搜索等基本操作。在实际工作中,难免使用Java对elasticsearch进行操作,本篇我们来介绍通过Java客户端如何创建索引、mappings和文档等。

引入maven依赖

引入elasticsearch和transport依赖如下所示。

  1. <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
  2. <dependency>
  3. <groupId>org.elasticsearch</groupId>
  4. <artifactId>elasticsearch</artifactId>
  5. <version>6.6.1</version>
  6. </dependency>
  7. <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/transport -->
  8. <dependency>
  9. <groupId>org.elasticsearch.client</groupId>
  10. <artifactId>transport</artifactId>
  11. <version>6.6.1</version>
  12. </dependency>

elasticsearch.yml配置

在使用Java API对elasticsearch操作之前,需要在elasticsearch.yml中添加必要的配置,在elasticsearch.yml配置文件结尾处追加以下配置信息。

  1. # elasticsearch集群名称
  2. cluster.name: my-elasticsearch
  3. # elasticsearch服务端口号
  4. http.port: 9200
  5. # 集群间通信端口号
  6. transport.tcp.port: 9300

如果在一台物理机上存在多个elasticsearch服务实例形成一个集群,服务端口号及集群建通信端口号需要不同。

使用Java客户端操作elasticsearch

使用Java客户端创建索引

使用Java客户端创建索引库的步骤可以总结为以下几步:

  • 创建一个setting对象,相当于一个配置信息,主要配置集群名称。
  • 创建一个客户端client对象
  • 使用client对象创建一个索引库
  • 关闭client

创建代码示例如下所示。

  1. public static void createIndex(ElasticSearchParams elasticSearchParams) throws UnknownHostException {
  2. if (Objects.isNull(elasticSearchParams) || Strings.isNullOrEmpty(elasticSearchParams.getIndexName())
  3. || Strings.isNullOrEmpty(elasticSearchParams.getIp())
  4. || Objects.isNull(elasticSearchParams.getPort())
  5. || Strings.isNullOrEmpty(elasticSearchParams.getClusterName())
  6. || elasticSearchParams.getPort() <= 0) {
  7. log.error("参数不合法");
  8. }
  9. // 创建Settings
  10. Settings settings = Settings.builder()
  11. .put("cluster.name", elasticSearchParams.getClusterName())
  12. .put("client.transport.ignore_cluster_name", true)
  13. .build();
  14. // 创建transportclient对象
  15. TransportClient transportClient = new PreBuiltTransportClient(settings);
  16. transportClient.addTransportAddress(new TransportAddress(InetAddress.getByName(elasticSearchParams.getIp()), elasticSearchParams.getPort()));
  17. transportClient.admin().indices().prepareCreate(elasticSearchParams.getIndexName())
  18. .get();
  19. transportClient.close();
  20. }

在执行上述demo代码后,通过了elasticsearch-head的插件查看创建索引库的创建情况,可以发现索引库创建成功,但是存在副本,如下图所示。在创建setting对象时,如何设置索引的分片与副本数量小编暂时还没有找到方法,希望有知道的小伙伴可以加以指点。
使用Java客户端创建索引

使用Java客户端对索引设置mapping信息

使用Java客户端对索引设置mapping信息的步骤总结为以下几步:

  • 创建一个settings对象
  • 创建一个client对象
  • 创建一个mapping信息,mapping信息为一个json数据,可以为字符串也可以使用XContextBuilder对象。
  • 使用client向elasticsearch服务器发送mapping信息
  • 关闭client对象

在设置mapping信息时,需要准备mapping信息,为一个json字符串,使用XContextBuilder构造json字符串,如下所示,其实就是一个json字符串的拼装,以startObject开始,endObject结束。

  1. XContentBuilder xContentBuilder = XContentFactory.jsonBuilder()
  2. .startObject()
  3. .startObject("house")
  4. .startObject("properties")
  5. .startObject("house_id")
  6. .field("type", "long")
  7. .field("store", true)
  8. .endObject()
  9. .startObject("house_guid")
  10. .field("type", "text")
  11. .field("store", true)
  12. .field("analyzer", "ik_smart")
  13. .endObject()
  14. .startObject("house_name")
  15. .field("type", "text")
  16. .field("store", true)
  17. .field("analyzer", "ik_smart")
  18. .endObject()
  19. .endObject()
  20. .endObject()
  21. .endObject();

向elasticsearch的index中设置索引的过程如下所示。

  1. public static boolean setMappings(ElasticSearchParams elasticSearchParams) throws IOException {
  2. TransportClient transportClient = buildTransportClient(elasticSearchParams);
  3. transportClient.admin().indices()
  4. // 设置要映射的
  5. .preparePutMapping(elasticSearchParams.getIndexName())
  6. // 设置要映射的type
  7. .setType("house")
  8. .setSource(elasticSearchParams.getXContentBuilder())
  9. .get();
  10. return true;
  11. }
  12. private static TransportClient buildTransportClient(ElasticSearchParams elasticSearchParams) throws UnknownHostException {
  13. if (Objects.isNull(elasticSearchParams) || Strings.isNullOrEmpty(elasticSearchParams.getIndexName())
  14. || Strings.isNullOrEmpty(elasticSearchParams.getIp())
  15. || Objects.isNull(elasticSearchParams.getPort())
  16. || Strings.isNullOrEmpty(elasticSearchParams.getClusterName())
  17. || elasticSearchParams.getPort() <= 0) {
  18. log.error("参数不合法");
  19. return null;
  20. }
  21. // 创建Settings
  22. Settings settings = Settings.builder()
  23. .put("cluster.name", elasticSearchParams.getClusterName())
  24. .put("client.transport.ignore_cluster_name", true)
  25. .build();
  26. // 创建transportclient对象
  27. TransportClient transportClient = new PreBuiltTransportClient(settings);
  28. transportClient.addTransportAddress(new TransportAddress(InetAddress.getByName(elasticSearchParams.getIp()), elasticSearchParams.getPort()));
  29. return transportClient;
  30. }

执行设置mapping信息后,通过elasticsearch-head查看为索引的设置的mapping信息,可以发现设置成功,如下图所示。
使用Java客户端设置mapping信息

使用Java客户端向索引中添加文档

在添加mapping信息后,就可以向索引中添加文档。同样添加过程可以总结为以下几步。

  • 创建一个Setting对象
  • 创建一个Client对象
  • 创建一个文档对象,即一个json字符串,同样可以使用XContextBuilder构造json字符串
  • 使用Client把文档添加到文档中
  • 关闭Client对象

下面是向索引中添加文档的示例代码。

  1. @Test
  2. public void addDocuments() throws IOException {
  3. ElasticSearchParams elasticSearchParams = new ElasticSearchParams();
  4. elasticSearchParams.setIndexName("20200128-xinghaol")
  5. .setIp("47.107.90.36")
  6. .setClusterName("my-elasticsearch")
  7. .setPort(9300);
  8. TransportClient transportClient = ElasticSearchUtil.obtainTransport(elasticSearchParams);
  9. XContentBuilder xContentBuilder = XContentFactory.jsonBuilder()
  10. .startObject()
  11. .field("house_id", "123456")
  12. .field("house_guid", "lsaldlsdlflskdkfk")
  13. .field("house_name", "elasticsearch测试房屋")
  14. .endObject();
  15. transportClient.prepareIndex(elasticSearchParams.getIndexName(), "house", "1")
  16. .setSource(xContentBuilder).get();
  17. transportClient.close();
  18. }

获取TransportClient方式与前面创建索引、mapping时相同,运行上述demo示例后,通过elasticsearch-head插件查看对应的index中已经存在我们添加的文档,如下图所示。
使用Java客户端添加文档

小节

本篇介绍了如何通过Java客户端向elasticsearch中创建索引,指定mapping信息,添加文档,对于初学者还是有所帮助。下一篇,我们将继续介绍如何通过Java客户端查询索引中的各个信息。

最后,希望全国疫情赶快过去,一线医护人员平安归来。武汉加油、中国加油。

发表评论

表情:
评论列表 (有 0 条评论,74人围观)

还没有评论,来说两句吧...

相关阅读