ElasticSearch Indice mapping和Index Template管理

bboss

The best elasticsearch highlevel java rest api——-bboss

ElasticSearch客户端框架bboss的ClientInterface 接口提供了创建/修改、获取、删除索引Indice和IndexTemplate的方法,本文举例说明其使用方法。

1 准备工作

参考文档在项目中导入Elasticsearch客户端:集成Elasticsearch Restful API案例分享

本文除了介绍索引Indice和Index Template的创建修改方法,还可以看到如何在dsl中添加注释的用法:

单行注释

  1. ## 注释内容

多行注释

  1. #*
  2. 。。。。注释内容
  3. 。。。
  4. *#

更多bboss dsl配置和定义的内容,参考文档:高性能elasticsearch ORM开发库使用介绍 章节【5.3 配置es查询dsl脚本语法

2 定义创建Indice的dsl脚本

在配置文件-esmapper/demo.xml中定义一个名称为createDemoIndice的dsl脚本:

  1. <!--
  2. 创建demo需要的索引表结构
  3. -->
  4. <property name="createDemoIndice">
  5. <![CDATA[{
  6. "settings": {
  7. "number_of_shards": 6,
  8. "index.refresh_interval": "5s"
  9. },
  10. "mappings": {
  11. "demo": {
  12. "properties": {
  13. "demoId":{
  14. "type":"long"
  15. },
  16. "contentbody": {
  17. "type": "text" ##定义text类型的全文检索字段
  18. },
  19. "agentStarttime": {
  20. "type": "date"
  21. ## ,"format":"yyyy-MM-dd HH:mm:ss.SSS||yyyy-MM-dd'T'HH:mm:ss.SSS||yyyy-MM-dd HH:mm:ss||epoch_millis"
  22. },
  23. "applicationName": {
  24. "type": "text",##定义text类型的全文检索字段
  25. "fields": { ##定义精确查找的内部keyword字段
  26. "keyword": {
  27. "type": "keyword"
  28. }
  29. }
  30. },
  31. "name": {
  32. "type": "keyword"
  33. }
  34. }
  35. }
  36. }
  37. }]]>
  38. </property>

3 创建indice/判断indice是否存在/删除indice

根据上面定义的dsl脚本文件初始化ClientInterface对象,并创建索引表demo:

  1. public void testCreateIndice(){
  2. //创建加载配置文件的客户端工具,单实例多线程安全
  3. ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/demo.xml");
  4. try {
  5. //判读索引表demo是否存在,存在返回true,不存在返回false
  6. boolean exist = clientUtil.existIndice("demo");
  7. //如果索引表demo已经存在先删除mapping
  8. if(exist)
  9. clientUtil.dropIndice("demo");
  10. //创建索引表demo
  11. clientUtil.createIndiceMapping("demo",//索引表名称
  12. "createDemoIndice");//索引表mapping dsl脚本名称,在esmapper/demo.xml中定义createDemoIndice
  13. //获取修改后的索引mapping结构
  14. String mapping = clientUtil.getIndice("demo");
  15. System.out.println(mapping);
  16. } catch (ElasticSearchException e) {
  17. // TODO Auto-generated catch block
  18. e.printStackTrace();
  19. }
  20. }

4 定义索引Template dsl脚本

通过定义索引模板,定义表结构相同,但是索引表名称不同的索引表的建表模板,通过index_patterns中对应的模式名称来匹配索引模板适用的索引表:

  1. <property name="demoTemplate">
  2. <![CDATA[{
  3. "index_patterns": "demo-*", ## 5.x版本中请使用语法:"template": "demo-*"
  4. "settings": {
  5. "number_of_shards": 30, ##定义分片数
  6. "number_of_replicas" : 2, ##定义副本数
  7. "index.refresh_interval": "5s" ## 定义索引写入刷新时间间隔
  8. },
  9. "mappings": {
  10. "demo": {
  11. "properties": {
  12. "contentbody": {
  13. "type": "text",
  14. "fields": {
  15. "keyword": {
  16. "type": "keyword",
  17. "ignore_above": 256
  18. }
  19. }
  20. },
  21. "agentStarttime": {
  22. "type": "date",
  23. "format":"yyyy-MM-dd HH:mm:ss.SSS||yyyy-MM-dd'T'HH:mm:ss.SSS||yyyy-MM-dd HH:mm:ss||epoch_millis"
  24. },
  25. "applicationName": {
  26. "type": "text",
  27. "fields": {
  28. "keyword": {
  29. "type": "keyword",
  30. "ignore_above": 256
  31. }
  32. }
  33. }
  34. }
  35. }
  36. }
  37. }]]>
  38. </property>

5 创建/获取/删除索引表模板

  1. public void testCreateTempate() throws ParseException{
  2. ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/demo.xml");
  3. //创建模板
  4. String response = clientUtil.createTempate("demotemplate_1",//模板名称
  5. "demoTemplate");//模板对应的脚本名称,在esmapper/demo.xml中配置
  6. System.out.println("createTempate-------------------------");
  7. System.out.println(response);//创建结果
  8. //获取模板
  9. /**
  10. * 指定模板
  11. * /_template/demoTemplate_1
  12. * /_template/demoTemplate*
  13. * 所有模板 /_template
  14. *
  15. */
  16. String template = clientUtil.executeHttp("/_template/demotemplate_1",ClientUtil.HTTP_GET);
  17. System.out.println("HTTP_GET-------------------------");
  18. System.out.println(template);
  19. ElasticSearchHelper.getRestClientUtil().deleteTempate("demotemplate_1");
  20. }

6 修改和获取索引表结构

修改先前创建的demo表,为其中的type demo增加email关键字段

定义dsl结构-esmapper/demo.xml

  1. <!--
  2. 修改demo 索引表的结构,增加email字段
  3. https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-put-mapping.html
  4. -->
  5. <property name="updateDemoIndice">
  6. <![CDATA[{
  7. "properties": {
  8. "email": {
  9. "type": "keyword"
  10. }
  11. }
  12. }]]>
  13. </property>

修改和获取mapping结构的方法:

  1. public void updateDemoIndice(){
  2. ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil(mappath);
  3. //修改索引表demo中type为demo的mapping结构,增加email字段,对应的dsl片段updateDemoIndice定义在esmapper/demo.xml文件中
  4. String response = clientUtil.executeHttp("demo/_mapping/demo","updateDemoIndice",ClientUtil.HTTP_PUT);
  5. System.out.println(response);
  6. //获取修改后的索引mapping结构
  7. String mapping = clientUtil.getIndice("demo");
  8. System.out.println(mapping);
  9. }

7 案例源码工程下载

https://github.com/bbossgroups/eshelloword-booter

https://gitee.com/bboss/eshelloword-booter

8 参考文档

https://my.oschina.net/bboss/blog/1556866

9 开发交流

elasticsearch技术交流:166471282

elasticsearch:

img