2008-08-19 17 views
10

में वाइल्डकार्डक्वायर त्रुटि मैं दस्तावेज़ों की खोज करने के लिए सोलर का उपयोग करता हूं और इस क्वेरी का उपयोग करके दस्तावेज़ों की खोज करने का प्रयास करते समय "id:*", मुझे यह क्वेरी पार्सर अपवाद बताता है कि यह क्वेरी * या के साथ पार्स नहीं कर सकता है? पहले चरित्र के रूप में।सोलर

HTTP Status 400 - org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery 

type Status report 

message org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery 

description The request sent by the client was syntactically incorrect (org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery). 

क्या यह सिर्फ * के साथ काम करने के लिए कोई पैच है? या यह ऐसी क्वेरी करने के लिए बहुत महंगा है?

उत्तर

1

मैं आईडी के साथ संभालने हूँ: * आपके सभी दस्तावेजों मैच के लिए, सही कोशिश कर रहे हैं?

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

आप अपनी स्थिति में ऐसे ही एक क्षेत्र नहीं जोड़ सकते हैं, तो आप एक regex कि कुछ भी आईडी क्षेत्र में पाया जा सकता है से मेल खाएंगे के साथ एक RegexQuery इस्तेमाल कर सकते हैं।

संपादित करें: वास्तव में सवाल का जवाब। मैंने इसे काम करने के लिए कभी भी एक पैच के बारे में नहीं सुना है, लेकिन मुझे आश्चर्य होगा अगर इसे उचित रूप से अच्छी तरह से काम करने के लिए भी बनाया जा सकता है। एक कारण है कि स्वेच्छापूर्ण PrefixQuery की एक समस्या पैदा कर सकता है के लिए this question देखें।

1

वास्तव में, मैं इस के लिए एक समाधान का उपयोग कर रहे हैं। मैं आईडी, जैसे करने के लिए एक चरित्र संलग्न: A1, A2, आदि

क्षेत्र में इस तरह के मूल्यों के साथ

, यह क्वेरी id:A*

का उपयोग कर खोज करने के लिए संभव है लेकिन एक सच्चे समाधान मौजूद है या नहीं पता लगाने के लिए प्यार होता है । क्योंकि उन अविश्वसनीय रूप से महंगा क्वेरी दी गई हैं और बहुत, बहुत, बहुत बड़ी अनुक्रमित पर धीमी गति से हो जाएगा

6

Lucene, आप डिफ़ॉल्ट रूप से एक तारक साथ WildcardQueries शुरू करने के लिए अनुमति नहीं है।

आप Lucene QueryParser उपयोग कर रहे हैं, setAllowLeadingWildcard (सही) पर इसे सक्षम करने के लिए कहते हैं।

आप एक निश्चित क्षेत्र सेट के साथ दस्तावेजों के सभी चाहते हैं, आप क्वेरी करने या QueryParser का उपयोग करने से प्रोग्राम के रूप में सूचकांक घूमना बंद काफी बेहतर हैं। उपयोगकर्ता इनपुट को पार्स करने के लिए आपको वास्तव में केवल QueryParser का उपयोग करना चाहिए।

5
id:[a* TO z*] id:[0* TO 9*] etc. 

मैं बस अपना सूचकांक पर lukeall में ऐसा किया है और यह काम किया, इसलिए यह Solr जो मानक क्वेरी पार्सर का उपयोग करता है में काम करना चाहिए। मैं वास्तव में सोलर का उपयोग नहीं करता हूं।

आधार लुसीन में एक अच्छा कारण है कि आप कभी भी प्रत्येक दस्तावेज़ के लिए पूछताछ क्यों नहीं करेंगे, ऐसा इसलिए है क्योंकि किसी दस्तावेज़ के लिए आपको क्वेरी करना होगा, आपको new indexReader("DirectoryName") का उपयोग करना होगा और इसके लिए एक क्वेरी लागू करनी होगी। इसलिए आप पूरी तरह से इसे करने के लिए एक प्रश्न को लागू करने को छोड़ सकता है और indexReader तरीकों numDocs() उपयोग करने वाले सभी दस्तावेजों की एक संख्या प्राप्त करने के लिए, और document(int n) दस्तावेज़ों में से किसी को पुनः प्राप्त करने।

14

आप सभी दस्तावेजों चाहते हैं, * पर एक प्रश्न कार्य करें: *

आप एक निश्चित क्षेत्र (जैसे आईडी) की कोशिश आईडी के साथ सभी दस्तावेजों चाहते हैं: [* को *]

4

तुम सिर्फ कर रहे हैं सभी दस्तावेजों को प्राप्त करने का प्रयास करते हुए, सोलर * * * क्वेरी का समर्थन करता है। यह एकमात्र समय है जब मुझे पता है कि सोलर आपको * के साथ एक प्रश्न शुरू करने देगा।मुझे यकीन है कि आपने शायद इसे सौर व्यवस्थापक पृष्ठ में डिफ़ॉल्ट क्वेरी के रूप में देखा है।

यदि आप पहले अक्षर के रूप में * के साथ एक और विशिष्ट क्वेरी करने की कोशिश कर रहे हैं, जैसे आईडी: * 456 तब मैंने देखा है कि सबसे अच्छे तरीकों में से एक उस क्षेत्र को दो बार इंडेक्स करना है। एक बार सामान्य रूप से (फ़ील्ड नाम: आईडी), और एक बार सभी वर्णों को उलट दिया जाता है (फ़ील्ड नाम: reverse_id)। फिर आप क्वेरी आईडी भेजकर अनिवार्य रूप से क्वेरी आईडी कर सकते हैं: 456 इसके बजाय क्वेरी reverse_id भेजकर: 654 इसके बजाय। उम्मीद है कि समझ में आता है।

आप http://www.mail-archive.com/[email protected]/ पर सोलर उपयोगकर्ता समूह मेलिंग सूची भी खोज सकते हैं जहां इस तरह के प्रश्न अक्सर आते हैं।

2

निम्न सौर समस्या डिफ़ॉल्ट ल्यूसीन क्वेरी पार्सर को कॉन्फ़िगर करने में सक्षम होने का अनुरोध है। https://issues.apache.org/jira/browse/SOLR-218

इस समस्या में आप निम्नलिखित वर्णन पा सकते हैं कि 'पैच' सौर कैसे करें। यह संशोधन आपको * के साथ प्रश्न शुरू करने की अनुमति देगा।

जोनास सॉल्क: मैं मूल रूप से अपडेट करने के बाद केवल एक जावा फ़ाइल: SolrQueryParser.java।

public SolrQueryParser(IndexSchema schema, String defaultField) { 
    ... 
    setAllowLeadingWildcard(true); 
    setLowercaseExpandedTerms(true); 
    ... 
} 

... 

public SolrQueryParser(QParser parser, String defaultField, Analyzer analyzer) { 
    ... 
    setAllowLeadingWildcard(true); 
    setLowercaseExpandedTerms(true); 
    ... 
} 

मैं अगर setLowercaseExpandedTerms की जरूरत है यकीन नहीं है ...