2014-09-16 119 views
15

ElasticSearch'ü, ES ile iletişim kurmak için Transport Client'ı kullanan Spring Web projesinde bir arama servisi olarak kullanıyorum.ElasticSearch'te Java API kullanırken JSON DSL'ten QueryBuilder nasıl oluşturulur?

JSON DSL'den bir QueryBuilder oluşturabilecek bir yöntem olup olmadığını merak ediyorum. örneğin, bu bool sorgusu DSL JSON'unu bir QueryBuilder'e dönüştürün. Ben web ön taraftan kullanıcının bool dize girişi alabilir ve querybuilder bu bool dizesini ayrıştırmak zorunda çünkü

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

Ben bu yöntemi gerekiyor. Ancak, QueryBuilders.boolQuery().must(matchQB).should(shouldQB).must_not(mustNotQB)'u kullanmaya uygun değildir. Çünkü birkaç zorunluluğa ihtiyacımız olabilir veya sorgulamamalıyız.

Varsa, bir yöntem JSON DSL'den bir QueryBuilder oluşturabilir veya alternatif çözümler varsa, çok daha kolay olacaktır.

PS: ES araştırması için bir DSL Dizesini bir QueryBuilder ürününe sarmanın iki yöntemini buldum. Biri WrapperQueryBuilder, ayrıntılarına buradan bakın. http://javadoc.kyubu.de/elasticsearch/HEAD/org/elasticsearch/index/query/WrapperQueryBuilder.html Başka bir QueryBuilders.wrapperQuery (Dize DSL).

cevap

9

Bir json biçim dizesi alabilen setQuery kullanabilirsiniz.

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

Not bu: gereklidir DSL sadece bir kısmını, {"query": } kısım bu gibi atlanırsa:

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

Teşekkür kullanabilirsiniz, iki bulduk DSL dizgisini QueryBuilder, wrapperQueryBuilder, başka bir QueryBuilders.wrapperQuery() – Armstrongya

+0

ihmal edemez ES API yöntemi {} sorgu ":} bölümü bana yardımcı olur, yardımlarınız için tekrar teşekkürler. – Armstrongya

+0

ES 5.0 kullananlarınız için bu artık çalışmıyor: https://discuss.elastic.co/t/set-source-in-searchrequestbuilder-with-es5-0-and-java-api/66870 –

11

Sen Cevabınız için QueryBuilders.wrapperQuery(jsonQueryString);

İlgili konular