web-dev-qa-db-ja.com

ElasticSearchでJava APIを使用するときにJSON DSLからQueryBuilderを構築する方法は?

ESと通信するためにトランスポートクライアントを使用するSpring Webプロジェクトの検索サービスとしてElasticSearchを使用しています。

JSON DSLからQueryBuilderを構築できるメソッドが存在するかどうか疑問に思っています。たとえば、このブールクエリDSL JSONをQueryBuilderに変換します。

_{
    "query" : {
        "bool" : {
            "must" : { "match" : {"content" : "quick"},
            "should": { "match": {"content" : "lazy"}
        }
    }
}
_

ユーザーのブール文字列入力をWebフロントサイドから受信し、このブール文字列をQueryBuilderに解析する必要があるため、このメソッドが必要です。ただし、QueryBuilders.boolQuery().must(matchQB).should(shouldQB).must_not(mustNotQB)の使用は適していません。いくつかの必須または非必須クエリが必要な場合があるためです。

JSON DSLからQueryBuilderを構築できるメソッドが存在する場合、または代替ソリューションが存在する場合は、はるかに簡単です。

PS:ES検索のためにDSL文字列をQueryBuilderにラップできる2つの方法を見つけました。 1つはWrapperQueryBuilderです。詳細はこちらを参照してください。 http://javadoc.kyubu.de/elasticsearch/HEAD/org/elasticsearch/index/query/WrapperQueryBuilder.html もう1つはQueryBuilders.wrapperQuery(String DSL)。

20
Armstrongya

QueryBuilders.wrapperQuery(jsonQueryString);を使用できます

24
bradvido

Json形式の文字列を受け取ることができるsetQueryを使用できます。

/**
 * Constructs a new search source builder with a raw search query.
 */
public SearchRequestBuilder setQuery(String query) {
    sourceBuilder().query(query);
    return this;
}

これに注意してください:DSLの一部のみが必要です、{"query": }の部分は、次のように省略されています。

SearchResponse searchResponse = client.prepareSearch(indices).setQuery("{\"term\": {\"id\": 1}}").execute().actionGet();
11
halfelf

調査する価値があるかもしれません 低レベルの残りのクライアント 。これにより、次のことができます。

RestClient esClient = RestClient.builder(new HttpHost("localhost", 9200, "http")).build();
Request request = new Request("POST", "/INDEX_NAME/_doc/_search");
request.setJsonEntity(yourJsonQueryString);

Response response = esClient.performRequest(request);

String jsonResponse = EntityUtils.toString(response.getEntity());
0
Sash