2014-08-28 11 views
6

मैं निम्नलिखित प्रारूप के साथ कुछ json दस्तावेज़ है: -या तथा और Elasticsearch क्वेरी में ऑपरेटर्स

_source: { 
      userId: "A1A1", 
      customerId: "C1", 
      component: "comp_1", 
      timestamp: 1408986553, 
    } 

मैं दस्तावेज़ निम्नलिखित पर आधारित क्वेरी करना चाहते हैं: -

((userId == currentUserId) OR (customerId== currentCustomerId) OR (currentRole ==ADMIN)) AND component= currentComponent) 

मैं उपयोग करने की कोशिश SearchSourceBuilder और QueryBuilders.matchQuery, लेकिन मैं AND और OR ऑपरेटरों के साथ एकाधिक उप प्रश्नों को रखने में सक्षम नहीं था।

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); 
searchSourceBuilder.query(QueryBuilders.matchQuery("userId",userId)).sort("timestamp", SortOrder.DESC).size(count); 

हम ओआर और एंड ऑपरेटरों का उपयोग करके लोचदार खोज कैसे पूछते हैं?

उत्तर

24

मुझे लगता है कि इस मामले में Bool query सबसे अच्छा शॉट है।

कुछ की तरह:

{ 
    "bool" : { 
     "must" : { "term" : { "component" : "comp_1" } }, 
     "should" : [ 
      { "term" : { "userId" : "A1A1" } }, 
      { "term" : { "customerId" : "C1" } }, 
      { "term" : { "currentRole" : "ADMIN" } } 
     ], 
     "minimum_should_match" : 1 
    } 
} 

कौन सा जावा में देता है:

QueryBuilder qb = QueryBuilders 
    .boolQuery() 
    .must(termQuery("component", currentComponent)) 
    .should(termQuery("userId", currentUserId)) 
    .should(termQuery("customerId", currentCustomerId)) 
    .should(termQuery("currentRole", ADMIN)) 
    .minimumShouldMatch("1"); // or .minimumNumberShouldMatch(1) 

must हिस्से हैं AND रों, should भागों सिवाय इसके कि आप कम से कम निर्दिष्ट कर सकते हैं, कम या ज्यादा OR रों हैं should से मिलान करने के लिए (minimum_should_match का उपयोग करके), डिफ़ॉल्ट रूप से यह न्यूनतम 1 होता है, मुझे लगता है (लेकिन आप इसे 0 पर सेट कर सकते हैं, जिसका अर्थ है कि कोई दस्तावेज़नहीं हैस्थिति भी वापस आ जाएगी)।

आप और अधिक जटिल क्वेरी नेस्ट शामिल AND और OR रों, बस घोंसला must या should भागों के अंदर अन्य bool प्रश्नों करना चाहते हैं तो।

इसके अलावा, जैसा कि आप सटीक मान (आईडी और इतने पर) की तलाश में हैं, शायद आप term queries instead of match queries का उपयोग कर सकते हैं, जो आपको विश्लेषण चरण छोड़ देता है (यदि उन क्षेत्रों का विश्लेषण किया जाता है, जो जरूरी नहीं है आईडी)। यदि उनका विश्लेषण किया जाता है, तो आप अभी भी ऐसा कर सकते हैं, लेकिन केवल तभी जब आप जानते हैं कि आपकी शर्तें कैसे संग्रहीत की जाती हैं (standard analyzer stores them lower cased for instance)।

+0

'.minimumShouldMatch' केवल एक तर्क के रूप में एक स्ट्रिंग लेता है, है ना? – BairDev

+0

@malte आप सही हैं। इस मामले में यह 'int', या' stringShouldMatch' के साथ 'stringNumberShouldMatch' होना चाहिए' स्ट्रिंग' के साथ। सही किया। –

+0

मुझे लगता है कि यह स्वीकार्य उत्तर होना चाहिए। +1 – NickGreen

2

यदि आप query_string query का उपयोग करते हैं, तो आपके एंड्रॉइड और ओआरएस को लुसीन लाइब्रेरी द्वारा व्याख्या किया जाएगा।

यह आपके लिए

(currentUserId OR currentCustomerId) AND currentComponent 
उदाहरण के लिए

खोज करने के लिए अनुमति देता है। डिफ़ॉल्ट रूप से, सभी क्षेत्रों में मानों की खोज की जाएगी।

+0

लेकिन कुछ 'QueryBuilders.queryString ("(userId:" + currentUserId + "या ग्राहक आईडी:" + CurrentCustomerId + "या currentRole:" + AdMIN + ") और घटक:" + वर्तमान कॉम्पोनेंट + ")") "कुछ' । ElasticSearch प्रलेखन के लिंक किए गए पृष्ठ से –

+0

: "कोई उपसर्ग फ़ील्ड निर्दिष्ट नहीं होने पर क्वेरी शर्तों के लिए डिफ़ॉल्ट फ़ील्ड। Index.query.default_field अनुक्रमणिका सेटिंग्स के लिए डिफ़ॉल्ट है, जो बदले में डिफ़ॉल्ट रूप से डिफ़ॉल्ट है।" जाहिर है, ElasticSearch इंडेक्स समय पर _all फ़ील्ड जोड़ता है, जिसके बाद हम लुसीन सिंटैक्स लागू कर सकते हैं। –

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