2016-07-28 34 views
2

我以嵌入式方式运行ES 2.3.3,但由于描述的异常,我无法调用DeleteByQuery操作。我将DeleteByQuery插件添加到了我的类路径中,并且还为我设置了plugin.types设置,但它仍然不起作用。如何在嵌入式ES中使用DeleteByQuery插件2.3.3

我Maven依赖: <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>2.3.3</version> </dependency> <dependency> <groupId>org.elasticsearch.plugin</groupId> <artifactId>delete-by-query</artifactId> <version>2.3.3</version> </dependency>

我的ES设置:

,其用于截断指数的动作
Settings elasticsearchSettings = Settings.settingsBuilder() 
.put("threadpool.index.queue_size", -1) 
.put("path.home", options.getDirectory()) 
.put("plugin.types", DeleteByQueryPlugin.class.getName()) 
.build(); 

NodeBuilder builder = NodeBuilder.nodeBuilder(); 
node = builder.local(true).settings(elasticsearchSettings).node(); 

调用。

DeleteByQueryRequestBuilder builder = new DeleteByQueryRequestBuilder(node.client(), DeleteByQueryAction.INSTANCE); 
      builder.setIndices(indexName).setQuery(QueryBuilders.matchAllQuery()).execute().addListener(new ActionListener<DeleteByQueryResponse>() { 
       public void onResponse(DeleteByQueryResponse response) { 
        if (log.isDebugEnabled()) { 
         log.debug("Deleted index {" + indexName + "}. Duration " + (System.currentTimeMillis() - start) + "[ms]"); 
        } 
        sub.onCompleted(); 
       }; 

       @Override 
       public void onFailure(Throwable e) { 
        log.error("Deleting index {" + indexName + "} failed. Duration " + (System.currentTimeMillis() - start) + "[ms]", e); 
        sub.onError(e); 
       } 
      }); 

例外的是我看到:

Caused by: java.lang.IllegalStateException: failed to find action [[email protected]3a2] to execute 
    at org.elasticsearch.client.node.NodeClient.doExecute(NodeClient.java:56) ~[elasticsearch-2.3.3.jar:2.3.3] 
    at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:359) ~[elasticsearch-2.3.3.jar:2.3.3] 

回答

3

我注意到,节点构造器调用与空插件列表的节点构造。我扩展了Node类以调用这个(protected)构造函数。

public class ESNode extends Node { 

    protected ESNode(Settings settings, Collection<Class<? extends Plugin>> plugins) { 
     super(InternalSettingsPreparer.prepareEnvironment(settings, null), Version.CURRENT, plugins); 
    } 
} 

使用ESNode加载所有需要的插件。

Set<Class<? extends Plugin>> classpathPlugins = new HashSet<>(); 
    classpathPlugins.add(DeleteByQueryPlugin.class); 
    node = new ESNode(settings, classpathPlugins).start(); 

这可能并不理想,但到目前为止它工作得很好。

相关问题