当前位置:   article > 正文

Elasticsearch使用update_by_query_elasticsearch update

elasticsearch update

    elasticsearch中有一个方法是批量修改,就是先查询出需要修改的索引记录,然后批量修改。这个本来没什么,但是使用过的都知道,用java来调用这个方法很别扭。

    一般来说,我们使用elasticsearch,都建议使用Java Rest Client,就是RestHighLevelClient这个api。这里得从Java Client和Java Rest Client说起了,低版本的elasticsearch提供了ElasticsearchClient的实现,TransportClient,一个传输客户端。在6.4.x 版本中,需要用TransportClient来构建ElasticsearchClient,并且这个client才是实现本文update_by_query所需的client。

    因为我们要使用UpdateByQueryRequestBuilder,所以必须使用ElasticsearchClient,而这个client只能通过TransportClient来构建,在6.4.x版本中,我们还需要引入transport依赖:

  1. <dependency>
  2. <groupId>org.elasticsearch.client</groupId>
  3. <artifactId>transport</artifactId>
  4. <version>6.4.0</version>
  5. </dependency>

    因为RestClient无法满足构建条件。transportclient连接elasticsearch,使用的端口是9300,而不是和restclient一样使用的是http连接的9200。

    对比一下restclient构建:

    elasticsearch开启了两种不同类型的服务端口,transportclient与elasticsearch更加的解耦合。

    前面提到了要使用UpdateByQueryRequestBuilder,就必须使用transport依赖。而改依赖里面就是一个简单的实现类PreBuiltTransportClient。

    前面废话这么多,无非就是现在elasticsearch版本多,依赖版本也多,而且有的api被丢弃,有的api发生了改变,让我们很难捉摸。

    下面我们通过一个简单的示例,了解一下update_by_query,首先通过工具以命令的方式看看执行结果:这里构建一个index=students,type=student的索引,有3条记录,每条记录有一个age字段均为18。

    这里通过执行查询然后修改操作,将student的age全部修改为32:

    操作执行成功,受影响的记录有3条。再次查看所有的索引记录:

    以上这个步骤是通过命令的方式验证了_update_by_query的可行性,我们现在通过java代码的方式来实现这种操作,前面说了,这个操作需要用到ElasticsearchClient,而ElasticsearchClient需要通过TransportClient来构建。这里直接给出源代码,我的pom.xml依赖是这样的:

    java代码:

  1. package com.xxx.elasticsearch;
  2. import java.net.InetAddress;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import org.apache.logging.log4j.LogManager;
  6. import org.apache.logging.log4j.Logger;
  7. import org.elasticsearch.client.ElasticsearchClient;
  8. import org.elasticsearch.common.settings.Settings;
  9. import org.elasticsearch.common.transport.TransportAddress;
  10. import org.elasticsearch.index.query.QueryBuilders;
  11. import org.elasticsearch.index.reindex.BulkByScrollResponse;
  12. import org.elasticsearch.index.reindex.UpdateByQueryAction;
  13. import org.elasticsearch.index.reindex.UpdateByQueryRequestBuilder;
  14. import org.elasticsearch.script.Script;
  15. import org.elasticsearch.script.ScriptType;
  16. import org.elasticsearch.transport.client.PreBuiltTransportClient;
  17. @SuppressWarnings("unchecked")
  18. public class UpdateByQueryApp {
  19. private static final Logger log = LogManager.getLogger(UpdateByQueryApp.class);
  20. private static ElasticsearchClient client = null;
  21. static{
  22. try {
  23. client = new PreBuiltTransportClient(Settings.EMPTY)
  24. .addTransportAddress(
  25. new TransportAddress(InetAddress.getByName("127.0.0.1"),9300)
  26. );
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. public static void update(){
  32. UpdateByQueryRequestBuilder updateByQuery = UpdateByQueryAction
  33. .INSTANCE.newRequestBuilder(client);
  34. Map<String, Object> params = new HashMap<String, Object>();
  35. params.put("age", 18);
  36. ScriptType type = ScriptType.INLINE;
  37. String lang = "painless";
  38. String code = "ctx._source.age=params.age";
  39. Script script = new Script(type, lang, code, params);
  40. BulkByScrollResponse response = updateByQuery.source("students").script(script)
  41. .filter(QueryBuilders.termQuery("age", "32"))
  42. .abortOnVersionConflict(false)
  43. .get();
  44. log.info("update : "+response.getUpdated());
  45. }
  46. public static void main(String[] args) {
  47. update();
  48. }
  49. }

    前面我们通过命令的方式将所有students索引记录的age修改为了32,这里我们就将所有age=32的记录,全部修改为age=18。运行程序,控制台打印信息如下:

  1. 2019-09-04 21:15:02 - org.elasticsearch.plugins.PluginsService.logPluginInfo [main] [INFO ] - no modules loaded
  2. 2019-09-04 21:15:02 - org.elasticsearch.plugins.PluginsService.logPluginInfo [main] [INFO ] - loaded plugin [org.elasticsearch.index.reindex.ReindexPlugin]
  3. 2019-09-04 21:15:02 - org.elasticsearch.plugins.PluginsService.logPluginInfo [main] [INFO ] - loaded plugin [org.elasticsearch.join.ParentJoinPlugin]
  4. 2019-09-04 21:15:02 - org.elasticsearch.plugins.PluginsService.logPluginInfo [main] [INFO ] - loaded plugin [org.elasticsearch.percolator.PercolatorPlugin]
  5. 2019-09-04 21:15:02 - org.elasticsearch.plugins.PluginsService.logPluginInfo [main] [INFO ] - loaded plugin [org.elasticsearch.script.mustache.MustachePlugin]
  6. 2019-09-04 21:15:02 - org.elasticsearch.plugins.PluginsService.logPluginInfo [main] [INFO ] - loaded plugin [org.elasticsearch.transport.Netty4Plugin]
  7. 2019-09-04 21:15:05 - com.xxx.elasticsearch.UpdateByQueryApp.update [main] [INFO ] - update : 3

    表明批量修改成功,可以查看记录:

    需要注意的是,transportclient和restclient他们构建时所需的端口是不一样的,分别是9300和9200。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号