2011-11-15 22 views
7

मैं schema.xml में निम्न फ़िल्टर का उपयोग करता हूं:सौर में लंबे ngrams कैसे बढ़ावा देने के लिए?

<filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="15" side="front"/> 

मैं लंबे ngrams को कैसे बढ़ा सकता हूं? उदाहरण के लिए, जब मैं "बुकपेज" की खोज करता हूं, तो एक दस्तावेज़ जिसमें "बुकपेज" होता है उसे केवल "पुस्तक" वाले दस्तावेज़ से बहुत अधिक रेट किया जाना चाहिए।

उत्तर

5

मुझे टर्म लम्बाई (यानी, फ़ंक्शन क्वेरी ऑपरेटर के साथ) गतिशील रूप से बढ़ावा देने का कोई तरीका नहीं पता है। मुझे संदेह है कि कोई नहीं है।

उस ने कहा, मैं अक्सर उस तर्क का अनुमान लगाना चाहता हूं जिसे आप ढूंढ रहे हैं: दीर्घकालिक मिलान एक उच्च अर्थपूर्ण वजन के लायक हैं।

सबसे आम तौर पर, मैं पाठ मान को दो अलग-अलग क्षेत्रों में अनुक्रमित करूंगा। एक ngrams के बिना एक न्यूनतम संसाधित पाठ क्षेत्र है। दूसरा समान है, लेकिन ngrams के साथ भी संसाधित।

यहां इस स्कीमा के कुछ नमूना अंश दिए गए हैं जिन्हें मैंने इस फैशन में उपयोग किया है। इस स्कीमा के खिलाफ खोजों के लिए, मैं text_ngram पर text फ़ील्ड को भारी रूप से बढ़ा दूंगा। इस प्रकार text फ़ील्ड के खिलाफ कोई भी मैच प्रासंगिकता को बहुत प्रभावित करेगा, जबकि text_ngram के खिलाफ मैच अभी भी प्रासंगिक परिणाम भी उठा सकते हैं।

<?xml version="1.0" encoding="UTF-8"?> 
<schema name="Sunspot Customized NZ" version="1.0"> 
    <types> 

    <!-- 
     A text type with minimal text processing, for the greatest semantic 
     value in a term match. Boost this field heavily. 
    --> 
    <fieldType name="text" class="solr.TextField" omitNorms="false"> 
     <analyzer> 
     <tokenizer class="solr.StandardTokenizerFactory" /> 
     <filter class="solr.StandardFilterFactory" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     </analyzer> 
    </fieldType> 

    <!-- 
     Looser matches with NGram processing for substrings of terms and synonyms 
    --> 
    <fieldType name="text_ngram" class="solr.TextField" omitNorms="false"> 
     <analyzer> 
     <tokenizer class="solr.StandardTokenizerFactory" /> 
     <filter class="solr.StandardFilterFactory" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" /> 
     <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="6" side="front" /> 
     </analyzer> 
    </fieldType> 

    <!-- other stuff --> 

    </types> 
    <fields> 

    <!-- id, other scalar values --> 

    <!-- catch-all for the text and text_ngram types --> 
    <field name="text"  stored="false" type="text"  multiValued="true" indexed="true" /> 
    <field name="text_ngram" stored="false" type="text_ngram" multiValued="true" indexed="true" /> 

    <!-- various dynamicField definitions --> 

    <!-- sample dynamicField definitions for text and text_ngram --> 
    <dynamicField name="*_text" type="text" indexed="true" stored="false" multiValued="false" /> 
    <dynamicField name="*_text_ngram" type="text_ngram" indexed="true" stored="false" multiValued="false" /> 

    </fields> 

    <!-- copy text fields into my text and text_ngram catch-all fields --> 
    <copyField source="*_text" dest="text" /> 
    <copyField source="*_text" dest="text_ngram" /> 

</schema> 

यह वही नहीं है जो आप खोज रहे हैं, लेकिन आप एक समान दृष्टिकोण का उपयोग कर सकते हैं।

उदाहरण के लिए, मध्यवर्ती एनजीआरएम-संसाधित क्षेत्र के प्रकारों का एक छोटा संग्रह बनाएं - कहें, लंबाई 1-3, 4-6, 7-9 - और उन्हें तदनुसार बढ़ाएं।

+0

वाह, इस दृष्टिकोण के लिए आपको बहुत बहुत धन्यवाद, इसे कई बार अनुक्रमणित करने के बारे में नहीं सोचा :) आप इस समाधान के साथ कैसे आए? – ndee

+1

मुझे वास्तव में पहली बार याद नहीं आया कि मैंने इस तकनीक का उपयोग किया - मुझे लगता है कि यह सोलर में एक बहुत ही आम दृष्टिकोण है। 'CopyField 'निर्देश इस प्रभाव के लिए एक बहुत मजबूत संकेत है। मैं अक्सर सटीक शब्द मिलान के बारे में सोचता हूं क्योंकि सबसे मजबूत अर्थपूर्ण मूल्य है, जहां समानार्थी शब्द, ngrams, stemming आदि सटीक शर्तों पर मिस के मामले में खोज परिणामों को "विस्तारित करने" के सभी दृष्टिकोण हैं। –

संबंधित मुद्दे