2017-05-24 105 views
3

我将Elasticsearch插件从版本2.4.0升级到5.4.0。这个插件实现了一个自定义查询,但对Elasticsearch Java Api进行了新的更改。我对如何注册新查询有点困惑。我在Elasticsearch网站搜索,发现我必须实现SearchPlugin接口并覆盖方法getQueries,但我仍然感到困惑,我是如何做到的。任何帮助?Elasticsearch查询插件

回答

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<MyQueryBuilder>。大多数其他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 
+0

谢谢,但我没有工作。我在Elasticsearch代码中搜索,我发现'QuerySpec'需要3个参数:查询名称,Writeable.Reader接口和QueryParser。 'Writeable.Reader'接口是我不知道在哪里找到的。我必须创建一个还是不是?我想我必须使用Elasticsearch中的一个,但我迷失在这里。 –

+0

您需要在运行中创建一个。 'MyQueryBuilder :: new'实际上是扩展到你所需要的,因为它是'@InterfaceInterface'。我将用非java8示例编辑答案。你可以在'org.elasticsearch.search.SearchModule#registerQueryParsers'中找到很多'QuerySpec'的例子。 –

+0

谢谢,我花了好几天的时间为我的问题寻找解决方案。再次感谢。 –