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)。
QueryBuilders.wrapperQuery(jsonQueryString);
を使用できます
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();
調査する価値があるかもしれません 低レベルの残りのクライアント 。これにより、次のことができます。
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());