2017-05-24 19 views
3

Elasticsearchプラグインをバージョン2.4.0から5.4.0にアップグレードします。このプラグインはカスタムクエリを実装していますが、Elasticsearch Java Apiの新しい変更では、新しいクエリを登録する方法が少し分かりません。私はElasticsearchサイトを検索して、SearchPluginインターフェイスを実装し、メソッドgetQueriesをオーバーライドする必要があることが判明しましたが、私はまだ混乱しています。どんな助け?弾性検索クエリプラグイン

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>を拡張します:

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):

答えて

1

あなたはこの(java8)のようなものを必要としています。他のほとんどのES提供のクエリはこれを拡張しています。

MyQueryBuilder::fromXContentは、私を捉えたもう1つの変更です。 2.xからorg.elasticsearch.index.query.QueryParser#parse(QueryParseContext parseContext)と同じようにする必要があります。

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

おかげではなく、私のために動作しませんでした:

MyQueryPluginはあなたplugin-descriptor.propertiesのように参照したいものです。私はElasticsearchコードを検索し、クエリの名前、 'Writeable.Reader'インターフェース、' QueryParser'の3つのパラメータが必要であることがわかりました。 'Writeable.Reader'インターフェースはどこにあるのかわかりません。私は1つまたはそれを作成する必要がありますか?私はElasticsearchのものを使う必要があると思いますが、私はここで失われています。 –

+0

オンザフライで作成する必要があります。 'MyQueryBuilder :: new'は実際には' @ FunctionalInterface'のように必要なものに拡張しています。私は非java8の例で答えを編集します。 'QuerySpec'の例は、' org.elasticsearch.search.SearchModule#registerQueryParsers'にたくさんあります。 –

+0

ありがとう、私は問題を解決するために何日も過ごしています。もう一度ありがとう。 –