लुसीन के साथ: यदि मैं उपसर्ग खोज करता हूं तो मुझे बहुत अधिक क्लॉज त्रुटि क्यों मिलती है?

मेरे पास एक ऐप कुछ समय के लिए उपसर्ग खोज कर रहा है। हाल ही में सूचकांक का आकार बढ़ गया था और यह पता चला कि ल्यूसीन को संभालने के लिए कुछ उपसर्ग बहुत दुर्लभ थे। यह मुझे एक बहुत सारे फेंक रहा है क्लॉज त्रुटि, जो बहुत निराशाजनक थी क्योंकि मैंने अपने जेएआर को देख रखा और पुष्टि की कि किसी भी कोड में वास्तव में कोई भी बूलियन क्वेरी नहीं है।

यह बहुत ज्यादा हिट अपवाद की तरह कुछ क्यों नहीं फेंकता है? और बुलियन क्वेरी के स्थैतिक अधिकतम खंडों को पूर्णांक में क्यों बढ़ाना वास्तव में यह त्रुटि दूर हो जाता है, जब मैं निश्चित रूप से केवल उपसर्ग क्वेरी का उपयोग कर रहा हूं? प्रश्नों को चलाने के लिए कुछ मौलिक है कि मैं समझ नहीं पा रहा हूं; क्या यह गुप्त रूप से बूलियन प्रश्न बन गया है?

0
ro fr bn

3 उत्तर

मैंने इसे पहले मारा है। इसे इस तथ्य के साथ करना है कि कवर के तहत ल्यूसीन, कई (सभी?) चीजों को बुलियन प्रश्नों में बदल देता है जब आप Query.rewrite() कहते हैं

From: http://lucene.apache.org/java/2_2_0/api/org/apache/lucene/search/Query.html#rewrite(org.apache.lucene.index.IndexReader)

public Query rewrite(IndexReader reader)
              throws IOException

    Expert: called to re-write queries into primitive queries.
            For example, a PrefixQuery will be rewritten into a
            BooleanQuery that consists of TermQuerys.

    Throws:
        IOException
0
जोड़ा
और यह Query.rewrite() रूपांतरण हमेशा क्वेरी वास्तव में निष्पादित होने से पहले होती है? (यह उचित प्रतीत होता है, कि निष्पादित होने से पहले क्वेरी को आदिम प्रश्नों को तोड़ने की जरूरत है।)
जोड़ा लेखक KajMagnus, स्रोत

उपसर्ग क्वेरी चलाते समय, लुसीन अपने "शब्दकोश" में सभी शर्तों की खोज करता है जो क्वेरी से मेल खाते हैं। यदि 1024 से अधिक (डिफ़ॉल्ट रूप से) मैच में, TooManyClauses-Exception फेंक दिया जाता है।

आप BooleanQuery.setMaxClauseCount को प्रत्येक BooleanQuery को अनुमत क्लॉज की अधिकतम संख्या बढ़ाने के लिए कॉल कर सकते हैं।

0
जोड़ा
यह समझ में आता है, लेकिन मेरे लिए मुद्दा यह था कि मेरे पास PrefixQuery वास्तव में एक BooleanQuery बनने का कोई तरीका नहीं था।
जोड़ा लेखक dlamblin, स्रोत

TooManyClauses के एपीआई संदर्भ पृष्ठ से पता चलता है कि PrefixQuery, FuzzyQuery, WildcardQuery, और RangeQuery इस तरह विस्तारित किया गया है (BooleanQuery में)। चूंकि यह एपीआई संदर्भ में है, यह एक ऐसा व्यवहार होना चाहिए जिससे उपयोगकर्ता भरोसा कर सकें। ल्यूसीन हिट की संख्या (एक दस्तावेज़ आईडी के अलावा एक इंट के अलावा) पर मनमानी सीमा नहीं रखता है, इसलिए "बहुत अधिक हिट" अपवाद समझ में नहीं आता है। शायद PrefixQuery.rewrite (IndexReader) को TooManyClauses को पकड़ना चाहिए और "बहुत सारे उपसर्ग" अपवाद को फेंकना चाहिए, लेकिन अभी यह इस तरह से व्यवहार नहीं करता है।

वैसे, उपसर्ग द्वारा खोज करने का एक और तरीका PrefixFilter का उपयोग करना है। या तो अपनी क्वेरी को इसके साथ फ़िल्टर करें या फ़िल्टर को ConstantScoreQuery से लपेटें।

0
जोड़ा
क्या PrefixFilter भी बूलियन क्लॉज में विस्तारित है? (या यह किसी भी तरह से लागू किया गया है?)
जोड़ा लेखक KajMagnus, स्रोत