如何在传输客户端或节点客户端中启用文档路由

bq3bfh9z  于 2021-06-21  发布在  Storm
关注(0)|答案(2)|浏览(301)

我想在ElasticSearch中使用路由字段。
但是我找不到任何javaapi来支持同样的功能。
我已经通过链接1和链接2,但似乎没有解决这个问题。
我的代码:

public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
    this.collector = collector;
    Settings settings = ImmutableSettings.settingsBuilder()
                        .put("cluster.name", elasticSearchCluster).build();
    this.client = new TransportClient(settings)
             .addTransportAddress(new InetSocketTransportAddress(esHost, esPort));
}

public void execute(Tuple tuple) {
    try {
        String document = tuple.toString();
        byte[] byteBuffer = document.getBytes();
        IndexResponse response = this.client.prepareIndex(indexName, type, id)
                                     .setSource(byteBuffer).execute().actionGet();
    } catch (Exception e) {
        e.printStackTrace();
    }
    collector.ack(tuple);
}

请注意,我在这里使用transportclient,因为在storm中使用节点客户机似乎不是一个好方法,但问题不在于此。如果有一个使用节点客户端路由的方法,请不要建议,否则transportclient的路由也会有很大的帮助。

kx1ctssn

kx1ctssn1#

我相信您混淆了es中两个不同的“路由”概念。一种是文档路由,另一种是索引分配路由(或“过滤”)。
这个 _routing 字段允许您指定为每个文档编制索引时要使用的值,以确定文档将在哪个分片上编制索引。您提供的其他两个链接引用一个索引级别(与文档级别相反)设置,该设置确定如何将索引的碎片分配给集群中的各个节点。
听起来你好像在尝试文档传送。这可以在javaapi中使用 IndexRequestBuilder 阶级与社会 setRouting(String) 方法。看看github上的源代码。
这里还有一些很好的代码示例,它们在索引期间指定了路由字段。

sbdsn5lh

sbdsn5lh2#

几乎!
你只需要替换一行代码

IndexResponse response = this.client.prepareIndex(indexName, type, id)
                                 .setSource(byteBuffer).execute().actionGet();

String routingValue = "ANY_ROUTING_VALUE_YOU_WANT";
    IndexResponse response = this.client.prepareIndex(indexName, type, id)                              .setSource(byteBuffer).setRouting(routingValue).execute().actionGet();

然后,您的文档将存储在与您提供的路由值相对应的特定分片中。在搜索时,可以提供相同的路由值,以便搜索请求只命中一个特定的碎片。

相关问题