Reindex elasticsearch 2.3.3使用Java NodeClient时

时间:2016-06-14 11:49:15

标签: java elasticsearch elasticsearch-plugin reindex

弃用SearchTye.SCAN和新Reindex API我们希望将弹性搜索群集和客户端从2.1.1迁移到2.3.3。

我们使用java和适当的库来访问elasticsearch。要访问集群,我们使用TransportClient,对于嵌入式Unittests,我们使用NodeClient。

不幸的是,Reindex API作为插件提供,NodeClient似乎无法处理。

所以问题是如何将NodeClient与Reindex-Plugin一起使用?

我已经尝试公开受保护的NodeClient构造函数,将ReindexPlugin类作为参数传递但没有成功。

使用NodeClient启动嵌入式ElasticSearch并使用添加了ReindexPlugin的TransportClient也没有工作。我得到的只是一个例外:ActionNotFoundTransportException[No handler for action [indices:data/write/reindex]]

感兴趣的依赖:

  • org.elasticsearch:elasticsearch:2.3.3
  • org.elasticsearch.module:重新索引:2.3.3
  • org.apache.lucene:lucene的表达式:5.5.1
  • org.codehaus.groovy:常规:2.4.6

启动NodeClient:

Settings.Builder settings = Settings.settingsBuilder();
settings.put("path.data", "/some/path/data");
settings.put("path.home", "/some/path/home");
//settings.put("plugin.types", ReindexPlugin.class.getName()); > No effect
settings.put("http.port", 9299);
settings.put("transport.tcp.port", 9399);

node = NodeBuilder.nodeBuilder()
    .clusterName("testcluster")
    .settings(settings)
    .local(true)
    .node();

// also tested with local(false), then no transport port is available, resulting in NoNodeAvailableException

使用TransportClient访问节点:

Settings settings = Settings.settingsBuilder()
    .put("cluster.name", "testcluster")
    .put("discovery.zen.ping.multicast.enabled", false)
    .build();
InetSocketTransportAddress[] addresses = new InetSocketTransportAddress[]
    {new InetSocketTransportAddress(new InetSocketAddress("localhost", 9399))};
client = TransportClient.builder()
    .settings(settings)
    .addPlugin(ReindexPlugin.class)
    .build()
    .addTransportAddresses(addresses);

触发重新索引的主要部分:

ReindexRequestBuilder builder = ReindexAction.INSTANCE.newRequestBuilder(getClient())
    .source(indexFrom)
    .destination(indexTo)
    .refresh(true);

1 个答案:

答案 0 :(得分:0)

通过结合上述两种方法,我能够解决这个问题。

因此,创建NodeClient涉及覆盖节点:

var button='<button class="close" type="button" title="Remove this page">×</button>';
var tabID = 1;
function resetTab(){
    var tabs=$("#tab-list li:not(:first)");//get all tabs except first tab
    var len=1;//we do not want to reset 1st tab
    $(tabs).each(function(k,v){
        len++;//increment it
        $(this).find('a').html('Tab ' + len + button); //replace each tabs html with latest index and button html.
    })
    tabID--;//decrement tabs count
}

在启动NodeClient时使用它:

class ExposedNode extends Node {
    public ExposedNode(Environment tmpEnv, Version version, Collection<Class<? extends Plugin>> classpathPlugins) {
        super(tmpEnv, version, classpathPlugins);
    }
}

之后,您可以使用添加ReindexPlugin的TransportClient,如问题中所述。

然而,这是一个肮脏的黑客,可能会在未来的版本中破解,并显示Elasticsearch支持插件开发的程度有多差。