我想在弹性搜索中使用routing-field。
但我无法找到任何Java API来启用它。
我经历了link 1和link 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的路由也会有很大的帮助。
答案 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();
然后,您的文档将存储在与您提供的路由值对应的特定分片中。在搜索时,您可以提供相同的路由值,以便您的搜索请求仅匹配一个特定分片。