我想在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的路由也会有很大的帮助。
2条答案
按热度按时间kx1ctssn1#
我相信您混淆了es中两个不同的“路由”概念。一种是文档路由,另一种是索引分配路由(或“过滤”)。
这个
_routing
字段允许您指定为每个文档编制索引时要使用的值,以确定文档将在哪个分片上编制索引。您提供的其他两个链接引用一个索引级别(与文档级别相反)设置,该设置确定如何将索引的碎片分配给集群中的各个节点。听起来你好像在尝试文档传送。这可以在javaapi中使用
IndexRequestBuilder
阶级与社会setRouting(String)
方法。看看github上的源代码。这里还有一些很好的代码示例,它们在索引期间指定了路由字段。
sbdsn5lh2#
几乎!
你只需要替换一行代码
从
至
然后,您的文档将存储在与您提供的路由值相对应的特定分片中。在搜索时,可以提供相同的路由值,以便搜索请求只命中一个特定的碎片。