2012-08-31 57 views
10

त्वरित प्रश्न, मुझे नहीं पता कि समानार्थी शब्दों से निपटने के लिए कैसे एक जगह है! मैं निम्नलिखित config है:सोलर - समानार्थी शब्द एकाधिक शब्द

SOLR कॉन्फ़िग फ़ाइल

<fieldType ... > 
    <analyzer type="index"> 
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
      <filter class="solr.WordDelimiterFilterFactory" 
          catenateWords="1" 
          preserveOriginal="1" 
          splitOnCaseChange="1" 
          generateWordParts="1" 
          generateNumberParts="1"   
          catenateNumbers="1" 
          catenateAll="1" 
          /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="30" side="front"/> 
    </analyzer> 
    <analyzer type="query">  
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.LengthFilterFactory" min="2" max="70" /> 
    <filter class="solr.SynonymFilterFactory" synonyms="syn.txt" ignoreCase="true" expand="true"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
</analyzer> 
</fieldType> 

मेरे फ़ाइल: syn.txt

st., st => saint 
istambul => istanbul 
airport, apt => aéroport 
NYC => New York 
pt., pt => port 
brussels => bruxelles 

सब कुछ पर्याय छोड़कर ठीक काम कर रहा था:

"NYC => New York" 

मैंने कुछ शोध किया और मुझे निम्नलिखित मिला:

ध्यान रखें कि जबकि SynonymFilter खुशी के साथ कई शब्दों से युक्त समानार्थी शब्द (यानी: "समुद्र बिस्कुट, समुद्र biscit, Seabiscuit") काम करेंगे

इस जैसे समानार्थी शब्दों से निपटने के लिए दृष्टिकोण की सिफारिश की, विस्तार करने के लिए है अनुक्रमण करते समय समानार्थी। ऐसा इसलिए है क्योंकि दो संभावित समस्याएं हैं जो क्वेरी समय पर व्यवस्थित कर सकती हैं:

ल्यूसीन क्वेरीपार्सर विश्लेषक को कोई भी पाठ देने से पहले सफेद स्थान पर टोकन करता है, इसलिए यदि कोई व्यक्ति समुद्र बिस्किट शब्दों की खोज करता है तो विश्लेषक को दिया जाएगा शब्द "समुद्र" और "बिस्किट" अलग से हैं, और यह नहीं पता कि वे एक समानार्थी से मेल खाते हैं।

वाक्यांश खोज (यानी: "समुद्र बिस्किट") क्वेरीरीसर को पूरी स्ट्रिंग को विश्लेषक को पास करने का कारण बनता है, लेकिन यदि SynonymFilter समानार्थी का विस्तार करने के लिए कॉन्फ़िगर किया गया है, तो जब क्वेरीपर्सर को टोकन की परिणामस्वरूप सूची वापस मिलती है विश्लेषक, यह एक MultiPhraseQuery का निर्माण करेगा जो वांछित प्रभाव नहीं होगा।

यह विश्लेषक के लिए उपलब्ध सीमित तंत्र की वजह से इंगित करता है कि दो पद एक ही स्थिति पर कब्जा करते हैं: यह इंगित करने का कोई तरीका नहीं है कि एक "वाक्यांश" शब्द के समान स्थिति पर कब्जा करता है।

हमारे उदाहरण के लिए, जिसके परिणामस्वरूप MultiPhraseQuery होगा "(समुद्र | समुद्र | Seabiscuit) (बिस्कुट | biscit)" जो "Seabiscuit" के सरल मामले से मेल नहीं होगा एक दस्तावेज

में उत्पन्न तो मैं करने की कोशिश की मेरी कॉन्फ़िगरेशन फ़ाइल को बदलने और इंडेक्सिंग पर अपने फ़िल्टर जोड़ने के लिए, लेकिन यह काम नहीं कर रहा है।

क्या कुछ विचार हैं?

+2

बहुभाषी समानार्थी शब्द के साथ सोलर में इस समस्या से सावधान रहें: http://www.opensourceconnections.com/blog/2013/10/27/why-is-multi-term-synonyms-so-hard-in-solr/ –

उत्तर

7

आप => के साथ स्पष्ट मैपिंग कर रहे हैं।

Solr documentation कहते

स्पष्ट मैपिंग "=>" की एलएचएस पर किसी भी टोकन क्रम का मिलान और आरएचएस पर सभी विकल्पों के साथ बदलें। इस प्रकार के मैपिंग स्कीमा में विस्तार पैरामीटर को अनदेखा करते हैं।

इसलिए मैं अनुमान लगा रहा हूँ कि अगर आप NYC के लिए खोज तुम वापस कुछ भी नहीं मिलता है, क्योंकि यह सूचकांक समय में New York से बदल दिया है।

इसके बजाय, क्या आप उन्हें समकक्ष समानार्थी के रूप में घोषित करने का प्रयास कर सकते हैं? अर्थात। NYC, New YorkNYC => New York की बजाय।

तब मुझे विश्वास है कि आप उनमें से किसी एक के लिए खोज कर सकते हैं और नतीजा वही होगा।

2

बारे

st., st => saint 

मुझे लगता है कि आप इसे इस तरह से करना चाहिए:

st. => saint 
st => saint 

बारे

NY => New York 

मैं ने वही समस्या का सामना करना पड़ रहा हूँ और निष्कर्ष यह है कि के लिए आया था क्योंकि पार्सिंग समानार्थी प्रतिस्थापन से पहले की जाती है, जो बहु शब्द होने पर समस्या उत्पन्न कर सकती है। मैंने पाया कि यह SynonymFactory में एक पार्सर शामिल करने के लिए संभव है:

<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" tokenizerFactory="solr.KeywordTokenizerFactory" /> 

मैं सिर्फ यह परीक्षण किया मैं बहुत बेहतर परिणाम मिल गया है, लेकिन अभी तक नहीं एक उम्मीद। आश्चर्यजनक रूप से पर्याप्त, KeywordTokenizerFactory जोड़ने पर सकारात्मक प्रभाव पड़ता है, WhitespaceTokenizerFactory या StandardTokenizerFactory जोड़ना कुछ भी बदलना प्रतीत नहीं होता है।

बीटीडब्ल्यू, यदि शिंगल्स का उपयोग नहीं करते हैं, तो यह पहले से ही ठीक होना चाहिए। पीआर Shadoko के जवाब पर

0

आधारित:

रास्ता देखो अपने विश्लेषक काम करता है, उदाहरण के लिए

http://localhost/solr/analysis/field?analysis.fieldvalue=EXAMPLE-KEYWORDS&q=EXAMPLE-KEYWORD%203&analysis.fieldname=EXAMPLEFIELD&analysis.showmatch=true 

विश्लेषण/क्षेत्र के साथ एक आउट-ऑफ-द-बॉक्स अनुरोध हैंडलर (solrconfig.xml में बैठा) है। Here आपको इसकी पैरामीटर सूची मिलती है। ("analysis.query" मेरे लिए काम नहीं करता है, इसलिए मुझे "क्यू" का उपयोग करना पड़ा)

समानार्थी फ़िल्टर के रूप में समानार्थी फ़िल्टर (कटौती) किसी भी समानार्थी से मेल खाने से पहले, बहु शब्द समानार्थी नहीं मिलेगा एक हिट। चाल एक पार्सर, जो वास्तव में पार्स नहीं है लेने के लिए SynonymFilter बताने के लिए है: (scalability keywordTokenizer

<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" tokenizerFactory="solr.KeywordTokenizerFactory" /> 

किसी भी तरह, इस दृष्टिकोण एक हैक की तरह लगता है और मैं दुष्प्रभाव अनुमान नहीं कर सकते, ...) - तो सावधान रहें!

4

समस्या यह है कि सोलर समानार्थी शब्द उत्पन्न करते हैं जब पहले वाक्यांश में शब्दों की संख्या दूसरे वाक्यांश में शब्दों की संख्या से कम होती है। जब ऐसा होता है, टोकन अन्य टोकन की स्थिति में बहती है।

मैं इस समस्या के लिए एक समाधान है, लेकिन यह सूचकांक और क्वेरी के समय solr.SynonymFilterFactory के दो का उपयोग करता है की आवश्यकता है।

इस तरह

:

<filter class="solr.SynonymFilterFactory" synonyms="multi_word_conversion.txt" 
ignoreCase="true" expand="true" /> 

<filter class="solr.SynonymFilterFactory" synonyms="layor_two_syns.txt" 
ignoreCase="true" expand="true"/> 

पहले फिल्टर में आप होगा: न्यूयॉर्क => New_York

दूसरा फिल्टर में: NYC => New_York

अब एक न्यूयॉर्क के लिए खोज एनवाईसी और इसके विपरीत छंद वाले परिणाम लौटाएंगे।

अंतिम नोट पर: यह विधि तब तक काम नहीं करेगी जब तक यह सूचकांक और क्वेरी समय पर न हो।

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