簡體   English   中英

使用Java NodeClient時重新索引elasticsearch 2.3.3

[英]Reindex elasticsearch 2.3.3 when using Java NodeClient

隨着SearchTye.SCAN和新的Reindex API的棄用,我們希望將我們的Elasticsearch集群和客戶端從2.1.1遷移到2.3.3。

我們使用java和適當的庫來訪問elasticsearch。 要訪問群集,我們使用TransportClient,對於嵌入式單元測試,我們使用NodeClient。

不幸的是,Reindex API是作為插件提供的,NodeClient似乎無法處理。

那么問題是如何將NodeClient與Reindex-Plugin一起使用?

我已經嘗試公開受保護的NodeClient構造函數以將ReindexPlugin類作為參數傳遞而沒有成功。

使用NodeClient啟動嵌入式ElasticSearch以及將TransportClient與添加的ReindexPlugin一起使用均無效。 我得到的只是一個異常: ActionNotFoundTransportException[No handler for action [indices:data/write/reindex]]

感興趣的依存關系:

  • org.elasticsearch:elasticsearch:2.3.3
  • org.elasticsearch.module:reindex:2.3.3
  • org.apache.lucene:lucene-expressions:5.5.1
  • org.codehaus.groovy: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);

通過結合上述兩種方法,我能夠解決此問題。

因此,創建NodeClient涉及覆蓋Node:

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

並在啟動NodeClient時使用它:

Settings.Builder settings = Settings.settingsBuilder();
settings.put("path.data", "/some/path/data");
settings.put("path.home", "/some/path/home");
settings.put("http.port", 9299);
settings.put("transport.tcp.port", 9399);

// Construct Node without NodeBuilder
List<Class<? extends Plugin>> classpathPlugins = ImmutableList.of(ReindexPlugin.class);
settings.put("node.local", false);
settings.put("cluster.name", "testcluster");
Settings preparedSettings = settings.build();
node = new ExposedNode(InternalSettingsPreparer.prepareEnvironment(preparedSettings, null), Version.CURRENT, classpathPlugins);
node.start();

之后,您可以使用TransportClient來添加ReindexPlugin,如問題中所述。

盡管如此,這是一個骯臟的技巧,可能會在將來的版本中打破,並且表明Elasticsearch對插件開發imo的支持程度很差。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM