2013-05-10 11 views
9

मैं लोचदार खोज और कोचबेस के लिए नया हूं। मैं लोचदार खोज और कोचबेस के बारे में अधिक जानने के लिए नमूना जावा एप्लिकेशन बना रहा हूं।लोचदार खोज - फ़िल्टरबिल्डर का उपयोग

ElasticSearch Java API पढ़ना, फ़िल्टरों का बेहतर इस्तेमाल उन मामलों में किया जाता है जहां स्कोर आवश्यक नहीं है और कैशिंग के लिए। मैं अभी भी पता लगा नहीं है कि कैसे FilterBuilders का उपयोग करें और निम्नलिखित प्रश्न हैं:

  • FilterBuilders खोज करने के लिए अकेले इस्तेमाल किया जा सकता है?
  • या क्या उन्हें हमेशा Query के साथ उपयोग किया जाना है? (यदि सही है, तो कृपया कोई उदाहरण सूचीबद्ध कर सकते हैं?)
  • दस्तावेज़ीकरण के माध्यम से जाना, यदि मैं फ़ील्ड मानों के आधार पर कोई खोज करना चाहता हूं और फ़िल्टरबिल्डर का उपयोग करना चाहता हूं, तो मैं इसे कैसे पूरा कर सकता हूं? (AndFilterBuilder या TermFilterBuilder या InFilterBuilder का उपयोग कर? मैं उन दोनों के बीच मतभेदों के बारे में स्पष्ट नहीं कर रहा हूँ।)

3 प्रश्न के लिए, मैं वास्तव में खोज प्रश्नों का उपयोग कर और जैसा कि नीचे दिखाया फ़िल्टर का उपयोग कर के साथ इसका परीक्षण किया। मुझे FilterBuilders का उपयोग करके खोज करने का प्रयास करने पर खाली परिणाम (कोई पंक्तियां नहीं) मिलीं। मुझे यकीन नहीं है कि मैं क्या गलत कर रहा हूं।

कोई भी उदाहरण उपयोगी होगा। मुझे दस्तावेज़ीकरण के माध्यम से कठिन समय मिला है, जिसे मैंने स्पैस पाया और यहां तक ​​कि खोज भी कई अविश्वसनीय उपयोगकर्ता मंचों का नेतृत्व किया।

private void processQuery() { 
     SearchRequestBuilder srb = getSearchRequestBuilder(BUCKET); 
     QueryBuilder qb = QueryBuilders.fieldQuery("doc.address.state", "TX"); 
     srb.setQuery(qb); 

     SearchResponse resp = srb.execute().actionGet(); 
     System.out.println("response :" + resp); 
    } 

private void searchWithFilters(){ 
     SearchRequestBuilder srb = getSearchRequestBuilder(BUCKET); 
     srb.setFilter(FilterBuilders.termFilter("doc.address.state", "tx")); 
     //AndFilterBuilder andFb = FilterBuilders.andFilter(); 
     //andFb.add(FilterBuilders.termFilter("doc.address.state", "TX")); 
     //srb.setFilter(andFb); 
     SearchResponse resp = srb.execute().actionGet(); 
     System.out.println("response :" + resp); 
    } 

- -UPDATE--

जवाब में सुझाव के रूप में, लोअरकेस "tx" काम करता है बदल रहा है। इस सवाल के साथ हल हो गया। मेरे पास अभी भी निम्नलिखित प्रश्न हैं:

  • किस परिदृश्य में, क्वेरी के साथ उपयोग किए जाने वाले फ़िल्टर हैं? यह किस उद्देश्य से काम करेगा?
  • InFilter, TermFilter और MatchAllFilter के बीच अंतर। कोई चित्रण मदद करेगा।

उत्तर

11

ठीक है, आपको क्वेरी निष्पादित करते समय भी दस्तावेजों को बाहर करने के लिए फ़िल्टर का उपयोग करना चाहिए। फ़िल्टर तेजी से होते हैं क्योंकि उनमें कोई स्कोरिंग और कैशबल भी शामिल नहीं होता है।

यह कहा गया है कि, यह स्पष्ट है कि आपको search api के साथ फ़िल्टर का उपयोग करना है, जो एक क्वेरी निष्पादित करता है और वैकल्पिक फ़िल्टर स्वीकार करता है। यदि आपके पास केवल एक फ़िल्टर है तो आप अपने फ़िल्टर के साथ match_all क्वेरी का उपयोग कर सकते हैं। एकाधिक फिल्टर एक साथ गठबंधन करने के लिए एक फ़िल्टर एक साधारण, या एक कंपंड एक हो सकता है।

Java API के संबंध में, उपयोग किए गए नाम फ़िल्टर के नाम उपलब्ध हैं, कोई बड़ा अंतर नहीं। उदाहरण के लिए this search example पर एक नज़र डालें। आपके कोड में मैं नहीं देखता कि आप अपने SearchRequestBuilder ऑब्जेक्ट पर setFilter कहां करते हैं। आपको एक फ़िल्टर का उपयोग करने के बाद, या तो फ़िल्टर करने और फ़िल्टर करने की प्रतीत नहीं होती है। इसके अलावा, हो सकता है कि आप डिफ़ॉल्ट मैपिंग का उपयोग कर अनुक्रमणित कर रहे हों, इस प्रकार "TX" शब्द कम हो गया है। यही कारण है कि जब आप फ़िल्टर शब्द का उपयोग करके खोज करते हैं तो आपको कोई मिलान नहीं मिलता है। लोअरकेड "टीएक्स" की खोज करने का प्रयास करें।

यदि आप "TX" शब्द को इंडेक्सिंग करते समय रखना चाहते हैं तो आप या तो अपने मैपिंग को बदल सकते हैं, शायद फ़ील्ड को not_analyzed के रूप में सेट करना चाहिए यदि यह केवल एक टोकन होना चाहिए। अन्यथा आप फ़िल्टर बदल सकते हैं, हो सकता है कि आप विश्लेषण की गई क्वेरी पर नज़र डालें, ताकि आपकी क्वेरी का विश्लेषण उसी तरह किया जा सके जैसे सामग्री को अनुक्रमित किया गया था।

  • MatchAllFilter: मैच अपने सभी दस्तावेज़, नहीं है कि उपयोगी मैं कहेंगे
  • TermFilter: फ़िल्टर दस्तावेजों है कि फ़ील्ड शामिल

    प्रश्नों और फिल्टर के बारे में अधिक जानकारी के लिए query DSL documentation पर एक नज़र डालें एक शब्द (विश्लेषण किया नहीं)

  • AndFilter: यौगिक फिल्टर में डालने के लिए इस्तेमाल किया है और दो या अधिक फिल्टर

पता नहीं क्या आप InFilterBuilder से मतलब है, इस नाम के साथ कोई फ़िल्टर नहीं मिला।

क्वेरी आमतौर पर टेक्स्ट खोज बॉक्स के माध्यम से उपयोगकर्ता के प्रकार में होती है। खोज खोज को परिशोधित करने के लिए फ़िल्टर अधिक तरीके हैं, उदाहरण के लिए पहलू प्रविष्टियों पर क्लिक करना। यही कारण है कि आपके पास अभी भी एक प्लस प्लस एक या अधिक फ़िल्टर होंगे।

+0

आप ठीक कह रहे हैं, मैं searchrequestbuilder पर फ़िल्टर सेट करने के पोस्ट संपादित। और "टीएक्स" में बदलकर मैं परिणाम देखता हूं! धन्यवाद। मैंने इस पोस्ट को संपादित करने के लिए संपादित किया है और कुछ प्रश्न जो अभी भी जारी हैं .. धन्यवाद। –

+0

मैंने आपके उत्तर को आपके अपडेट किए गए प्रश्न के अनुसार अपडेट किया है, इसे जांचें। – javanna

+0

उदाहरण के लिए लिंक को तोड़ने के लिए इस खोज उदाहरण पर एक नज़र डालें। –

6

@javanna क्या कहा के पीछे जोड़ने के लिए:

भ्रम का एक बहुत तथ्य यह है कि फिल्टर कई मायनों में परिभाषित किया जा सकता से आ सकता है: उदाहरण के match_all के लिए,

आप क्या अंतर पूछ सकते हैं। और वास्तव में आप दोनों तरीकों से बिल्कुल वही तर्क बना सकते हैं।

अंतर यह है कि एक क्वेरी दोनों परिणामों के साथ-साथ आपके द्वारा परिभाषित किए गए किसी भी पहलू पर चलती है। हालांकि, एक फ़िल्टर (जब परिभाषित स्टैंडअलोन) केवल परिणामसेट पर काम करता है और आपके द्वारा परिभाषित किए गए किसी भी पहलू पर नहीं (यहां बताया गया है: http://www.elasticsearch.org/guide/reference/api/search/filter/)

2

अन्य उत्तरों में जोड़ने के लिए, इनफिल्टर केवल फ़िल्टरबिल्डर के साथ उपयोग किया जाता है। परिभाषा है, इनफिल्टर: उनमें से किसी पर मेल खाने वाली कई शर्तों के आधार पर फ़ील्ड के लिए फ़िल्टर।

क्वेरी जावा एपीआई फ़िल्टरबिल्डर का उपयोग करता है, जो फ़िल्टर बिल्डर्स के लिए एक कारखाना है जो गतिशील रूप से जावा कोड से क्वेरी बना सकता है। हम इसे एक फॉर्म का उपयोग करके करते हैं और हम चेकबॉक्स, विकल्प और ड्रॉपडाउन के साथ उपयोगकर्ता चयनों के आधार पर हमारी क्वेरी बनाते हैं।

यहाँ कुछ Example code for FilterBuilders है और नीचे के रूप में दिखाया गया है कि लिंक InFilter का उपयोग करता है से एक टुकड़ा है:

FilterBuilder filterBuilder; 
    User user = (User) auth.getPrincipal(); 
    if (user.getGroups() != null && !user.getGroups().isEmpty()) { 
     filterBuilder = FilterBuilders.boolFilter() 
       .should(FilterBuilders.nestedFilter("userRoles", FilterBuilders.termFilter("userRoles.key", auth.getName()))) 
       .should(FilterBuilders.nestedFilter("groupRoles", FilterBuilders.inFilter("groupRoles.key", user.getGroups().toArray()))); 
    } else { 
     filterBuilder = FilterBuilders.nestedFilter("userRoles", FilterBuilders.termFilter("userRoles.key", auth.getName())); 
    } 
    ... 
संबंधित मुद्दे