【问题标题】:Elasticsearch query pluginElasticsearch 查询插件
【发布时间】:2017-10-25 01:38:49
【问题描述】:

我正在将 Elasticsearch 插件从 2.4.0 版本升级到 5.4.0。这个插件实现了一个自定义查询,但是随着 Elasticsearch Java Api 的新变化,我对如何注册新查询有点困惑。我在 Elasticsearch 站点中搜索,我发现我必须实现 SearchPlugin 接口并覆盖方法 getQueries 但我仍然很困惑,我如何做到这一点。有什么帮助吗?

【问题讨论】:

    标签: java elasticsearch elasticsearch-plugin


    【解决方案1】:

    你需要这样的东西(java8):

    public class MyQueryPlugin extends Plugin implements SearchPlugin {
    
        @Override public List<QuerySpec<?>> getQueries() {
            return Arrays.asList(
                    new QuerySpec<>("my_query", MyQueryBuilder::new, MyQueryBuilder::fromXContent)
            );
        }
    }
    

    或者这个(java 7):

    public class MyQueryPlugin extends Plugin implements SearchPlugin {
    
        @Override
        public List<QuerySpec<?>> getQueries() {
            return Arrays.asList(new QuerySpec<>(
                    "my_query",
                    new Writeable.Reader<MyQueryBuilder>() {
                        @Override
                        public MyQueryBuilder read(StreamInput in) throws IOException {return new MyQueryBuilder(in);}
                    },
                    new QueryParser<MyQueryBuilder>() {
                        @Override
                        public Optional<MyQueryBuilder> fromXContent(QueryParseContext parseContext) throws IOException {return MyQueryBuilder.fromXContent(parseContext);}
                    })
            );
        }
    }
    

    MyQueryBuilder 可能会扩展AbstractQueryBuilder&lt;MyQueryBuilder&gt;。大多数其他 ES 提供的查询都对此进行了扩展 - 它们是一个很好的复制来源。

    MyQueryBuilder::fromXContent 是另一个让我感到震惊的变化 - 它应该与 2.x 中的 org.elasticsearch.index.query.QueryParser#parse(QueryParseContext parseContext) 相同。

    MyQueryPlugin 是您在 plugin-descriptor.properties 中引用的内容,例如:

    description=my-query example
    version=1.0.0
    name=my-query
    java.version=1.8
    elasticsearch.version=5.4.0
    classname=com.example.MyQueryPlugin
    

    【讨论】:

    • 谢谢,但对我不起作用。我在 Elasticsearch 代码中搜索,发现QuerySpec 需要 3 个参数:查询名称、Writeable.Reader 接口和QueryParser。 Writeable.Reader 接口是我不知道在哪里找到的。我必须创建一个还是不创建?我想我必须使用 Elasticsearch 中的一个,但我在这里迷路了。
    • 您需要动态创建一个。 MyQueryBuilder::new 实际上正在扩展到您需要的内容,因为它是 @FunctionalInterface。我将使用非 java8 示例编辑答案。你可以在org.elasticsearch.search.SearchModule#registerQueryParsers中找到很多QuerySpec的例子
    • 谢谢,我花了几天时间来寻找解决问题的方法。再次非常感谢。
    猜你喜欢
    • 2014-11-08
    • 2017-03-13
    • 2015-12-18
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多