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

时间:2016-02-27 03:19:10

标签: elasticsearch apache-storm

我想在弹性搜索中使用routing-field

但我无法找到任何Java API来启用它。

我经历了link 1link 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,因为似乎没有一种使用Node-Client的好方法,但问题与此无关。如果有一种方法可以将Node-Client与路由一起使用,请建议否则TransportClient的路由也会有很大的帮助。

2 个答案:

答案 0 :(得分:2)

我相信你在ES中混淆了两种不同的“路由”概念。一个是document routing,另一个是index allocation routing(或“过滤”)。

_routing字段允许您指定在索引每个文档时使用的值,以确定文档将被索引到哪个分片。您提供的其他两个链接指的是索引级(与文档级相反)设置,该设置确定索引的分片如何分配给各个节点你的集群。

听起来你正在尝试进行文档路由。这可以使用IndexRequestBuilder类和setRouting(String)方法在Java API中完成。看看source code on GitHub

还有一些good code examples here指定索引期间的路由字段。

答案 1 :(得分:1)

几乎!

你可以只替换一行代码

来自

    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();

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