背景


    随着时间的推进,es里面的索引文件越来越大。要想保住系统的效率,就必须要分索引、分路由。那么问题来了,目前项目上采用的是Spoon7.1进行数据更新,这样就存在以下问题:

    1、利用spoon连es时,索引的名称不支持动态变量?


    2、抽取数据时,对es里不存在的索引,spoon会自动生成,但不能生成我想要的mapping?


    3、抽取到es,spoon不能指定文档插入的路由?


分析

   
针对第二点:可以利用es的template功能,设定模板,利用spoon往es里抽取时,不存在的索引会自动生成。生成索引的时候会按照我们设置的模板进行生成,包括mapping。

    针对第一点:利用现有的功能,没有找到怎么实现。


    针对第三点:对于es2.0之前的版本,可以设置按照文档的某个字段进行自动路由,但之后的版本不支持。


    结论:要么不用工具,要么改造工具。比较了以下,后者工作量较小一点,确定这个为最终目标。


插件改造

    1、kettle
spoon整个项目都是开源的,可以去github上下载你想改造的版本。然后就是漫长的本地部署,一定要注意下载的源码版本号要和安装版的版本号一致。这个过程可以参考:https://blog.csdn.net/tj_java/article/details/78765158

    2、分析plugins/elasticsearch-bulk-insert-plugin下的源代码,如果改造的话,这里会涉及到改造

ElasticSearchBulkDialog.java和ElasticSearchBulk.java文件。具体细节就不详述了。


   
3、修改后编译整个目录,然后将这两个文件的编译文件替换到elasticsearch-bulk-insert-plugin-7.0.0.0-25.jar下


    4、改造的结果如下:


        


工程实施(简单示例)

1、创建索引模板template_user,创建userindex开头的索引都会采取以下配置。
请求地址:localhost:9200/_template/template_user 请求类型:put 请求参数: { "template" :
"userindex*", "settings" : { "number_of_shards" : 1, "number_of_replicas": 0 },
"mappings" : { "usertype": { "properties": { "date": { "format":
"strict_date_optional_time||epoch_millis", "type": "date" }, "sfzh": { "index":
"not_analyzed", "type": "string" }, "ryxm": { "index": "not_analyzed", "type":
"string" }, "type": { "type": "string" } } } } }

2、创建spoon转换,每个月的数据都存放在“userindex+年月”索引,user路由下。

       


3、建立job,每隔10s抽取一次数据

    


4、点击执行。修改计算机的时间,调整月份,会发现会自动创建索引,数据也全部在user路由下面。如图:

     


备注

    1、es版本:2.3.2      spoon版本:7.1 ,下载地址请点击此处
<https://mp.csdn.net/postedit/79690483>。


    2、es插件改造后的jar包下载地址。链接:https://pan.baidu.com/s/1Sgiue867Rxro1cFAdMWEtQ
密码:ejnj

    3、想看我其他关于es总结的,可以查看我的其他文章 <https://mp.csdn.net/postlist>
。如果喜欢的,记得点赞。QQ:614774796,欢迎相互交流!