2009-07-06 15 views
10

मैं वर्तमान में एक सूचकांक में पॉप्युलेट डेटा खोजने के लिए लुसीन का उपयोग करने का प्रयास कर रहा हूं।लुसेन - वाक्यांशों में वाइल्डकार्ड

मैं इसे ब्रैकेट्स (यानी "प्रोसेसिंग दस्तावेज़") में संलग्न करके सटीक वाक्यांशों से मेल खाता हूं, लेकिन लुसीन को किसी भी प्रकार का "प्रसंस्करण दस्तावेज़ *" करके उस वाक्यांश को खोजने के लिए नहीं मिल सकता है।

अंत में वाइल्डकार्ड स्पष्ट अंतर है।

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

उद्धरण जोड़ना है, लेकिन "दस्तावेज़ *"

कोई नहीं है सहायता की सराहना की जाएगी

+0

इसके साथ झुकाव। संभावित कामकाज क्या वाइल्डकार्ड के साथ निकटता खोज करने का कोई तरीका है? ऐसा लगता है कि इस पर प्रदर्शन पर एक बड़ा हिट हो सकता है। –

उत्तर

0

केवल क्वेरीज़र्स वाक्यांशों में वाइल्डकार्ड का समर्थन नहीं करता है, PhraseQuery ही केवल शर्तों का समर्थन करता है। MultiPhraseQuery करीब आता है, लेकिन जैसा कि इसके सारांश में कहा गया है, आपको अभी भी वाइल्डकार्ड से मेल खाने के लिए indexReader.terms को गिनने की आवश्यकता है।

0

ऐसा लगता है कि डिफ़ॉल्ट क्वेरीपर्स इसे संभाल नहीं सकता है। आप शायद वाक्यांशों में वाइल्डकार्ड के लिए एक कस्टम क्वेरीपर्सर बना सकते हैं। यदि आपका उदाहरण प्रतिनिधि है, तो stemming आपकी समस्या का समाधान कर सकता है। यह देखने के लिए कि क्या यह फिट बैठता है, कृपया PorterStemFilter के लिए प्रलेखन पढ़ें।

8

लुसेन 2.9 में ComplexPhraseQueryParser है जो वाक्यांशों में वाइल्डकार्ड को संभाल सकता है।

1

आप जो खोज रहे हैं वह FuzzyQuery है जो Levenshtein distance पर आधारित शब्दों के साथ परिणामों की खोज करने की अनुमति देता है। वैकल्पिक रूप से आप slop of PhraseQuery (MultiPhraseQuery में भी उपलब्ध) का उपयोग करने पर विचार करना चाहेंगे यदि शब्दों का क्रम महत्वपूर्ण नहीं है।

0

एनजीआरएम और विशेष रूप से एजग्राम का उपयोग करने का एक और विकल्प है। http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.EdgeNGramFilterFactory

यह ngrams या शब्दों के हिस्सों के लिए अनुक्रमणिका बना देगा। दस्तावेज, 5 का एक न्यूनतम ngram आकार और 8 की अधिकतम ngram आकार के साथ, सूचकांक होगा: Docum Docume दस्तावेज़ दस्तावेज़

वहाँ सूचकांक आकार और समय के लिए एक समंजन का एक सा है। सॉलर बुक्स में से एक मोटा गाइड के रूप में उद्धरण: इंडेक्सिंग 10 गुना अधिक 5 गुना अधिक डिस्क स्पेस का उपयोग करता है 6 गुना अधिक विशिष्ट शब्द बनाता है।

हालांकि, एजग्राम उस से बेहतर प्रदर्शन करेगा।

आपको यह सुनिश्चित करने की ज़रूरत है कि आप अपने प्रश्नों में वाइल्डकार्ड वर्ण सबमिट न करें। चूंकि आप वाइल्डकार्ड खोज नहीं कर रहे हैं, आप ngrams (शब्दों के कुछ हिस्सों) पर एक खोज शब्द से मेल खाते हैं।

0

मैं भी वही चीज़ ढूंढ रहा था और जो मैंने पाया वह है PrefixQuery इस "प्रसंस्करण दस्तावेज़ *" जैसी कुछ चीज़ों का संयोजन देता है। लेकिन यह बात यह है कि आप जिस क्षेत्र को खोज रहे हैं उसे अनौपचारिक और स्टोर करना चाहिए लोअरकेस (ऐसा इसलिए कारण है क्योंकि यह अनजान इंडेक्सर आपके फील्ड वैल्यू को लोअरकेस में सेव नहीं करेगा) इसके लिए काम करने के लिए।यहाँ PrefixQuery के लिए कोड जो मेरे लिए काम किया है: -

List<SearchResult> results = new List<SearchResult>(); 
Lucene.Net.Store.Directory searchDir = FSDirectory.GetDirectory(this._indexLocation, false); 
IndexSearcher searcher = new IndexSearcher(searchDir); 
Hits hits; 

BooleanQuery query = new BooleanQuery(); 
query.Add(new PrefixQuery(new Term(FILE_NAME_KEY, keyWords.ToLower())), BooleanClause.Occur.MUST); 
hits = searcher.Search(query); 
this.FillResults(hits, results); 
0

उपयोग 0.

की ढिलाई के साथ एक SpanNearQuery दुर्भाग्य से Lucene.Net में कोई SpanWildcardQuery है। या तो आपको SpanMultiTermQueryWrapper का उपयोग करने की आवश्यकता होगी, या थोड़ा प्रयास के साथ आप java version को C# में परिवर्तित कर सकते हैं।