2009-08-20 11 views
9

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

मैंने अतीत में अनुमानित मिलान के एन-ग्राम का उपयोग किया था, और मैं था यह जानकर बहुत खुशी हुई कि ल्यूसीन (और सोलर) बॉक्स से बाहर कुछ का समर्थन करता है। दुर्भाग्य से, मैं इसे सही तरीके से कॉन्फ़िगर करने में सक्षम नहीं हूं।

मैं मान लिया है कि मैं इस के लिए एक विशेष क्षेत्र प्रकार की जरूरत है, तो मैं मेरी Schema.xml के लिए निम्न क्षेत्र प्रकार कहा:

<fieldType 
    name="trigrams" 
    stored="true" 
    class="solr.StrField"> 
<analyzer type="index"> 
    <tokenizer 
     class="solr.analysis.NGramTokenizerFactory" 
     minGramSize="3" 
     maxGramSize="5" 
     /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
</analyzer> 
</fieldType> 

और करने के लिए स्कीमा में उपयुक्त क्षेत्र बदल दिया है:

<field name="title" type="trigrams" 
    indexed="true" stored="true" multiValued="false" /> 

हालांकि, यह मेरी अपेक्षा के अनुसार काम नहीं कर रहा है। क्वेरी विश्लेषण सही ढंग से दिखता है, लेकिन मुझे कोई परिणाम नहीं मिलते हैं, जो मुझे विश्वास दिलाता है कि इंडेक्स समय पर कुछ होता है (यानी शीर्षक को ट्रिगर फ़ील्ड के बजाय डिफ़ॉल्ट स्ट्रिंग फ़ील्ड की तरह अनुक्रमित किया जाता है)।

क्वेरी मैं कोशिश कर रहा हूँ की तरह

title:"guy walks into a psychiatrist office" 

(लिखने में कोई त्रुटि के साथ या दो) कुछ है और यह मैच चाहिए "लड़का एक मनोचिकित्सक कार्यालय में वॉक्स"।

(मैं वास्तव में यकीन है कि अगर क्वेरी सही है नहीं कर रहा हूँ।)

इसके अलावा, मैं वास्तव में अधिक कुछ करने के लिए सक्षम होने के लिए करना चाहते हैं। मैं स्ट्रिंग को कम करना चाहता हूं, सभी विराम चिह्नों और रिक्त स्थान को हटाएं, अंग्रेज़ी स्टॉपवर्ड हटाएं और फिर स्ट्रिंग को ट्रिग्राम में बदलें। हालांकि, फ़िल्टर केवल टोकन के बाद लागू किए जाने के बाद लागू होते हैं ...

आपके उत्तरों के लिए अग्रिम धन्यवाद।

+0

आप क्वेरी का उपयोग कर रहे पोस्ट कर सकते हैं? – olle

+0

मैंने एक उदाहरण क्वेरी शामिल करने के लिए प्रश्न संपादित किया। –

उत्तर

3

समाधान बहुत आसान साबित हुआ: और डिफ़ॉल्ट ऑपरेटर के रूप में सेट किया गया था, और यदि कोई भी ngrams मेल नहीं खाता है, तो पूरी क्वेरी विफल हो गई। तो, यह जोड़ने के लिए पर्याप्त था:

<solrQueryParser defaultOperator="OR" /> 

मेरी स्कीमा परिभाषा में।

+5

आपका उत्तर ऐसा लगता है कि एक पोस्टरियोरी के पास ngrams से कोई लेना देना नहीं है। क्या मैं सही हू? –

+2

@RyszardSzopa 'OR' defiantly एन-ग्राम विश्लेषण के समान नहीं है। 'OR 'बहुत सारे परिणाम देता है लेकिन आम तौर पर बहुत खराब परिणाम देता है। –

9

अपने प्रश्न के अंतिम भाग के उत्तर देने के लिए: solr में भी एक ngram फ़िल्टर है। तो तुम ngram tokenizer (लेकिन उदाहरण के लिए "WhitespaceTokenizer" की तरह एक) का उपयोग करना चाहिए नहीं, सभी पूर्व ngram फिल्टर लागू कर और फिर जोड़ने के इस एक:

<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="3" /> 
संबंधित मुद्दे