delete-by-query插件使用
1 | TransportClient.builder().settings(settings).addPlugin(DeleteByQueryPlugin.class).build(); |
deleteByQuery插件是通过按照查询出来的doc 来进行删除操作。
- es的集群都需要安装deleteByQuery 插件,到es的安装目录里执行plugin install deletebyQuery命令则可安装
- es安装完需要重启,重新加载插件
- 客户端创建时需要添加plugin的支持如上面代码
- eg:
1 | /** |
这种方式是通过拼装请求json 来获得查询条件,然后es发送json查询。
1 | /** |
这种方式是通过原生es的查询查询数据,两种效果一样,不过我还是比较喜欢第二种。第一种可以动态生成查询条件,第二种动态生成好像是不行。
update-by-query 插件使用
1 | TransportClient.builder().settings(settings).addPlugin(ReindexPlugin.class).build(); |
- update-by-query插件是通过按照查询出来的doc 来进行更新操作,主要原理应该是:es不支持直接操作es单条记录,所以要把更新的记录拿出来,然后删除原来的,把更新后插入进去。
- es 不需要安装,不需要重启
- 工程中添加reindex.jar,jar包在下载es里面的lib中可以找到
- 客户端创建时需要添加plugin的支持如上面代码
- eg:
1 | UpdateByQueryRequestBuilder ubqrb=UpdateByQueryAction.INSTANCE.newRequestBuilder(client); |
update-by-query 的难点在于一开始的script的写法,一开始不懂如何写script,后来看了各种文档api,才发现ctx.source是最重要的一个参数。后面的才是es的对应的列名(mapping),个人感觉ctx代表了所有数据的所有属性。
总结
通过学习两种插件的使用,更加了解了es的运作,现在用的是2.4.1的版本。没有升级,好像5的版本已经自带插件了,不需要再手动添加插件了。不过,还是觉得es配合sql的操作还是不让人放心。复杂的业务操作还是用原生的es,不需要用sql插件,不然会出现一些不可预知的情况。