当前位置: 首页 > 面试题库 >

如何为Elasticsearch自定义插件编写测试?

谷梁英毅
2023-03-14
问题内容

我创建了自定义的 Elasticsearch 插件。现在,我想为此插件编写一个测试。我的期望是-我可以运行嵌入Elasticsearch
实例,对其进行正确设置,然后进行一些测试(对一些文档进行索引,然后对其进行查询)

问题是我无法正确设置插件

自定义插件代码正在解析JSON查询并设置一些对象供以后使用:

public class CustomQueryParserPlugin extends AbstractPlugin {
    public static final String PLUGIN_NAME = "custom_query";
    private final Settings settings;

    @Inject
    public CustomQueryParserPlugin (Settings settings) {
        this.settings = settings;
    }

    @Override
    public String name() {
        return PLUGIN_NAME;
    }

    @Override
    public String description() {
        return "custom plugin";
    }

    public void onModule(IndicesQueriesModule module) {
        module.addQuery(new CustomQueryParser(settings));
    }
}

测试代码:

public class CustomParserPluginTest extends ElasticsearchSingleNodeTest {

    private static Node newNode() {
        final Settings settings = ImmutableSettings.builder()
                .put(ClusterName.SETTING, nodeName())
                .put("node.name", nodeName())
                .put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 1)
                .put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0)
                .put(EsExecutors.PROCESSORS, 1) // limit the number of threads created
                .put("http.enabled", false)
                .put("plugin.types", CustomParserPlugin.class.getName())
                .put("path.plugins", pathToPlugin)
                .put("index.store.type", "ram")
                .put("config.ignore_system_properties", true) // make sure we get what we set :)
                .put("gateway.type", "none").build();
        Node build = NodeBuilder.nodeBuilder().local(true).data(true).settings(
                settings).build();
        build.start();
        assertThat(DiscoveryNode.localNode(build.settings()), is(true));
        return build;
    }


    @Test
    public void jsonParsing() throws URISyntaxException {
        final Client client = newNode().client();
        final SearchResponse test = client.prepareSearch("test-index").setSource(addQuery()).execute().actionGet();
    }

    private String addQuery() {
         return "{"match_all":{"boost":1.2}}"
    }

我已经为 pathToPlugin 尝试了多个值-但似乎没有什么效果很好,因为JSON查询总是给我一个例外:

QueryParsingException[[test-index] No query registered for [custom_query]];

我能找到的所有文档都是关于安装插件并在某些本地Elasticsearch安装上对其进行测试。

我在这里做错了什么?是否有类似的文档或测试示例?

UPD 。这是一个带有CustomQueryParserPlugin提取代码的仓库-https:
//github.com/MysterionRise/es-custom-
parser

可能在测试中的初始化部分中,我需要在内存中创建索引吗?


问题答案:

要为您的插件编写测试,您可以使用Elasticsearch Cluster
Runner
。作为参考,请检查MinHash插件如何编写测试。

更新:

我将CustomParserPluginTest类更改为使用Elasticsearch Cluster Runner:

import static org.codelibs.elasticsearch.runner.ElasticsearchClusterRunner.newConfigs;
import java.util.Map;
import junit.framework.TestCase;
import org.codelibs.elasticsearch.runner.ElasticsearchClusterRunner;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.ImmutableSettings.Builder;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.get.GetField;
import org.junit.Assert;
import org.elasticsearch.action.search.SearchResponse;
import static org.hamcrest.core.Is.is;

public class CustomParserPluginTest extends TestCase {

    private ElasticsearchClusterRunner runner;

    @Override
    protected void setUp() throws Exception {
        // create runner instance
        runner = new ElasticsearchClusterRunner();
        // create ES nodes
        runner.onBuild(new ElasticsearchClusterRunner.Builder() {
            @Override
            public void build(final int number, final Builder settingsBuilder) {
            }
        }).build(newConfigs().ramIndexStore().numOfNode(1));

        // wait for yellow status
        runner.ensureYellow();
    }

    @Override
    protected void tearDown() throws Exception {
        // close runner
        runner.close();
        // delete all files
        runner.clean();
    }

    public void test_jsonParsing() throws Exception {
        final String index = "test_index";

        runner.createIndex(index, ImmutableSettings.builder().build());
        runner.ensureYellow(index);

        final SearchResponse test = runner.client().prepareSearch(index).setSource(addQuery()).execute().actionGet();
    }

    private String addQuery() {
        return "{\"match_all\":{\"boost\":1.2}}";
    }
}

我创建了es-plugin.properties(pluginrootdirectory \ src \ main \
resources)文件,其内容如下,这将迫使elasticsearch实例加载插件:

plugin=CustomQueryParserPlugin

当您运行此测试时,您将在输出中看到新创建的Elasticsearch实例加载了插件。

[2015-04-29 19:22:10,783] [INFO] [org.elasticsearch.node] [节点1]版本[1.5
.0],pid [34360],内部版本[5448160 / 2015-03-23T14:30: 58Z] [2015-04-29
19:22:10,784] [INFO] [org.elasticsearch.node] [Node 1]初始化… [2015-04-29
19:22:10,795] .elasticsearch.plugins] [节点1]已加载[ custom_query ],网站[]
[2015-04-29 19:22:13,342] [INFO] [org.elasticsearch.node] [节点1]已初始化

[2015-04-29 19:22:13,342] [信息] [org.elasticsearch.node] [节点1]开始..

希望这可以帮助。



 类似资料:
  • 本文向大家介绍MyBatis 如何编写一个自定义插件?相关面试题,主要包含被问及MyBatis 如何编写一个自定义插件?时的应答技巧和注意事项,需要的朋友参考一下 自定义插件实现原理: MyBatis 自定义插件针对 MyBatis 四大对象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)进行拦截: Executor:拦截内

  • 问题内容: 我需要为AngularJS编写一个自定义模块,但是我找不到关于该主题的任何好的文档。如何为AngularJS编写一个可以与他人共享的自定义模块? 问题答案: 在这种情况下,您认为文档无法再为您提供帮助,一个很好的学习方法是查看其他已经构建的模块,看看其他人是如何做到的,他们如何设计架构以及如何将它们集成到其中。他们的应用。 在查看其他人的工作之后,您至少应该有一个起点。 例如,看看任何

  • 问题内容: 我有一个Java类,用户: 我收到一个包含来自Web服务的用户对象的JSON列表: 我试图编写一个自定义反序列化器: 但是我的解串器不起作用。如何为Gson编写自定义JSON解串器? 问题答案: 我假设User类具有适当的构造函数。

  • 问题内容: 我正在将NHibernate与旧的rdbms规则引擎一起使用。我正在使用GenericDialect,但生成的某些sql无法正常工作。如果我需要为此规则引擎编写自定义方言,该如何开始? 问题答案: 这是一个方言示例: 它所在的程序集引用了NHibernate.dll hibernate.cfg.dll(请注意,我这里没有设置’connection.connection_string’属

  • 问题内容: 如何编写Android Studio插件? 我一直在寻找文档,但是很遗憾,文档很少或很差,所以可以推荐哪些文章? Eclipse或IntelliJ IDEA插件可以在Android Studio中使用吗? 问题答案: 由于Android Studio基于IntelliJIDEA,因此IntelliJ文档是一个很好的起点: Jetbrains插件开发

  • 我正在构建一个webapp,如果禁用Javascript,它将依赖于 标记。我想验证该标记所显示的内容,但我不确定如何使用我所拥有的任何框架或任何一般框架来实现这一点。 现在的测试,我使用噩梦和茉莉花测试。我不必使用这些,但如果可能的话,我仍然希望使用Javascript。 我在这里完全被难住了,甚至不知道从哪里开始--所有的StackOverflow问题似乎都是关于如何使用 ,而不是在端到端或单