2014-09-16 8 views
15

मैं स्प्रिंग वेब प्रोजेक्ट में एक खोज सेवा के रूप में लोचदार खोज का उपयोग कर रहा हूं जो ईएस के साथ संवाद करने के लिए परिवहन क्लाइंट का उपयोग कर रहा है।ElasticSearch में जावा एपीआई का उपयोग करते समय JSON DSL से QueryBuilder का निर्माण कैसे करें?

मुझे आश्चर्य है कि कोई ऐसी विधि मौजूद है जो JSON DSL से QueryBuilder का निर्माण कर सके। उदाहरण के लिए, इस बूल क्वेरी डीएसएल जेएसओएन को एक क्वेरीबिल्डर में कनवर्ट करें।

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

मैं इस विधि की जरूरत है क्योंकि मैं वेब सामने की ओर से उपयोगकर्ता की bool स्ट्रिंग इनपुट प्राप्त है, और एक QueryBuilder को यह bool स्ट्रिंग पार्स करने की है। हालांकि यह QueryBuilders.boolQuery().must(matchQB).should(shouldQB).must_not(mustNotQB) का उपयोग करने के अनुरूप नहीं है। क्योंकि हमें कई जरूरी या गैर-पूछताछ की आवश्यकता हो सकती है।

यदि कोई विधि मौजूद है तो JSON DSL से क्वेरीब्यूल्डर का निर्माण कर सकते हैं या वैकल्पिक समाधान मौजूद हैं, यह बहुत आसान होगा।

पीएस: मुझे दो विधि मिल गई हैं जो ईएस खोज के लिए एक डीएसएल स्ट्रिंग को क्वेरीब्यूल्डर में लपेट सकती हैं। एक WrapperQueryBuilder, यहां विवरण देखें। http://javadoc.kyubu.de/elasticsearch/HEAD/org/elasticsearch/index/query/WrapperQueryBuilder.html दूसरा QueryBuilders.wrapperQuery (स्ट्रिंग डीएसएल) है।

उत्तर

9

आप 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(); 
+0

धन्यवाद, मैं दो मिल गया है ईएस एपीआई में विधि जो डीएसएल स्ट्रिंग को क्वेरीब्यूल्डर को लपेट सकती है, एक है WrapperQueryBuilder, दूसरा QueryBuilders.wrapperQuery() – Armstrongya

+0

{"क्वेरी":} भाग को छोड़कर आपकी मदद के लिए धन्यवाद, धन्यवाद। – Armstrongya

+0

ईएस 5.0 का उपयोग करने वाले आप में से, यह अब काम नहीं करता है: https://discuss.elastic.co/t/set-source-in-searchrequestbuilder-with-es5-0-and-java-api/66870 –

11

आप अपने जवाब के लिए उपयोग कर सकते हैं QueryBuilders.wrapperQuery(jsonQueryString);

संबंधित मुद्दे