Elasticsearch使用update_by_query

Elasticsearch使用update_by_query

2023年7月18日发(作者:)

Elasticsearch使⽤update_by_query elasticsearch中有⼀个⽅法是批量修改,就是先查询出需要修改的索引记录,然后批量修改。这个本来没什么,但是使⽤过的都知道,⽤java来调⽤这个⽅法很别扭。 ⼀般来说,我们使⽤elasticsearch,都建议使⽤Java Rest Client,就是RestHighLevelClient这个api。这⾥得从Java Client和JavaRest Client说起了,低版本的elasticsearch提供了ElasticsearchClient的实现,TransportClient,⼀个传输客户端。在6.4.x 版本中,需要⽤TransportClient来构建ElasticsearchClient,并且这个client才是实现本⽂update_by_query所需的client。 因为我们要使⽤UpdateByQueryRequestBuilder,所以必须使⽤ElasticsearchClient,⽽这个client只能通过TransportClient来构建,在6.4.x版本中,我们还需要引⼊transport依赖: transport 6.4.0 因为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来构建。这⾥直接给出源代码,我的依赖是这样的: java代码:package csearch;import dress;import p;import ;import ager;import ;import csearchClient;import gs;import ortAddress;import uilders;import ScrollResponse;import ByQueryAction;import ByQueryRequestBuilder;import ;import Type;import ltTransportClient;@SuppressWarnings("unchecked")public class UpdateByQueryApp {

private static final Logger log = ger(); private static ElasticsearchClient client = null;

static{ try { client = new PreBuiltTransportClient() .addTransportAddress( new TransportAddress(ame("127.0.0.1"),9300) ); } catch (Exception e) { tackTrace(); } }

public static void update(){ UpdateByQueryRequestBuilder updateByQuery = UpdateByQueryAction .uestBuilder(client); Map params = new HashMap(); ("age", 18); ScriptType type = ; String lang = "painless"; String code = "ctx._="; Script script = new Script(type, lang, code, params); BulkByScrollResponse response = ("students").script(script) .filter(ery("age", "32")) .abortOnVersionConflict(false) .get(); ("update : "+ated()); }

public static void main(String[] args) { update(); }} 前⾯我们通过命令的⽅式将所有students索引记录的age修改为了32,这⾥我们就将所有age=32的记录,全部修改为age=18。运⾏程序,控制台打印信息如下:2019-09-04 21:15:02 - ginInfo [main] [INFO ] - no modules loaded2019-09-04 21:15:02 - ginInfo [main] [INFO ] - loaded plugin [xPlugin]2019-09-04 21:15:02 - ginInfo [main] [INFO ] - loaded plugin [JoinPlugin]2019-09-04 21:15:02 - ginInfo [main] [INFO ] - loaded plugin [atorPlugin]2019-09-04 21:15:02 - ginInfo [main] [INFO ] - loaded plugin [hePlugin]2019-09-04 21:15:02 - ginInfo [main] [INFO ] - loaded plugin [4Plugin]2019-09-04 21:15:05 - [main] [INFO ] - update : 3 表明批量修改成功,可以查看记录: 需要注意的是,transportclient和restclient他们构建时所需的端⼝是不⼀样的,分别是9300和9200。

发布者:admin,转转请注明出处:http://www.yc00.com/news/1689628490a271998.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信