2012-02-15 16 views
12

हम हालांकि ट्वीट, मैं निम्न सेटिंग वाले WordDelimiterFactory उपयोग कर रहा हूँ, @username या #hashtags के लिए खोज करने के लिए सक्षम होने के लिए खोज करने के लिए Solr संस्करण 3.5 का उपयोग कर रहे हैं: निम्नलिखितSolr खोज या उल्लेख

<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0" splitOnNumerics="0" preserveOriginal="1" handleAsChar="@#"/> 

मैंने देखा पैच लेकिन ऐसा लगता है कि यह काम नहीं कर रहा है, क्या मुझे कुछ याद आ रही है?

https://issues.apache.org/jira/browse/SOLR-2059

लेकिन @username के लिए खोज भी सिर्फ उपयोगकर्ता नाम या #hashtag सिर्फ hastag के लिए परिणाम लौटा रहा है के लिए परिणाम लौटाते है। इसे कैसे प्राप्त किया जा सकता है?

पूरी फ़ील्ड प्रकार:

<fieldType name="textnostem" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true"> 
    <analyzer type="index"> 
    <charFilter class="solr.HTMLStripCharFilterFactory"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      enablePositionIncrements="true" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="1" 
      catenateNumbers="1" 
      catenateAll="0" 
      splitOnCaseChange="0" 
      splitOnNumerics="0" 
      preserveOriginal="1" 
      /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      enablePositionIncrements="true" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="1" 
      catenateNumbers="1" 
      catenateAll="0" 
      splitOnCaseChange="0" 
      splitOnNumerics="0" 
      preserveOriginal="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 

<fieldType name="textnostem" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true"> 
    <analyzer type="index"> 
    <charFilter class="solr.HTMLStripCharFilterFactory"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      enablePositionIncrements="true" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="1" 
      catenateNumbers="1" 
      catenateAll="0" 
      splitOnCaseChange="0" 
      splitOnNumerics="0" 
      preserveOriginal="1" 
      /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      enablePositionIncrements="true" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="1" 
      catenateNumbers="1" 
      catenateAll="0" 
      splitOnCaseChange="0" 
      splitOnNumerics="0" 
      preserveOriginal="1"/>  
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

<fieldType name="textnostem" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true"> 
    <analyzer type="index"> 
    <charFilter class="solr.HTMLStripCharFilterFactory"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      enablePositionIncrements="true" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="1" 
      catenateNumbers="1" 
      catenateAll="0" 
      splitOnCaseChange="0" 
      splitOnNumerics="0" 
      preserveOriginal="1" 
      handleAsChar="@#" 
      /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      enablePositionIncrements="true" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" 
      generateWordParts="1" 
      generateNumberParts="1" 
      catenateWords="1" 
      catenateNumbers="1" 
      catenateAll="0" 
      splitOnCaseChange="0" 
      splitOnNumerics="0" 
      preserveOriginal="1" 
      handleAsChar="@#" 
      />  
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 
+0

क्या आप पूरे फ़ील्ड टाइप टाइप परिभाषा का उपयोग कर सकते हैं, तो हम कर सकते हैं यदि अन्य फ़िल्टर या टोकनकार आपको परिणाम प्रभावित कर रहे हों? –

+1

व्यक्तिगत रूप से, मैं सिर्फ आपके सूचकांक में दो फ़ील्ड जोड़ता हूं, एक उल्लेख की सूची के लिए, टैग के लिए एक। जब आप उन्हें इंडेक्स में जोड़ते हैं तो इन्हें अपनी ट्वीट्स से बाहर निकाल दें। इस तरह आप नई कार्यक्षमता पर भरोसा नहीं कर रहे हैं। –

उत्तर

15

ठीक है, तो SOLR-2059 पैच कि आप का उल्लेख के माध्यम से पढ़ने, ऐसा लगता है कि वे types विशेषता के साथ WordDelimiterFactory पर handleAsChar विशेषता जगह ले ली है। यहाँ एनालाइजर से उस विशेषता के लिए विनिर्देश है, Tokenizers और टोकन फ़िल्टर Solr विकी पेज:

प्रकार = "wdfftypes.txt" इस फिल्टर के लिए अनुकूलित tokenization अनुमति देता है। फ़ाइल solr/conf निर्देशिका में मौजूद होनी चाहिए, और प्रविष्टियां फॉर्म के हैं (उद्धरण के बिना) "% => ALPHA" या "\ u002C => Digit"। स्वीकार्य प्रकार हैं: लोअर, अप्पर, अल्फा, डिजिटल, अल्फानम, SUBWORD_DELIM। निम्नलिखित

तो फिर अगर हम इस दस्तावेज़ के अलावा SOLR-2059 से फ़ाइल का उदाहरण लेते हैं, मैं सुझाव है: इस प्रकार

<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0" splitOnNumerics="0" preserveOriginal="1" types="twittertypes.txt"/>

फिर twittertypes.txt फ़ाइल को परिभाषित करने और इसे अपने solma.xml फ़ाइल के रूप में उसी फ़ोल्डर में रखें जो आपके सौर उदाहरण (शायद conf फ़ोल्डर) में है।

# A customized type mapping for WordDelimiterFilterFactory 
# the allowable types are: LOWER, UPPER, ALPHA, DIGIT, ALPHANUM, SUBWORD_DELIM 
#  
# the default for any character without a mapping is always computed from 
# Unicode character properties 

# Map the $, %, '.', and ',' characters to DIGIT 
# This might be useful for financial data. 
@ => ALPHA 
\u0023 => ALPHA 

सूचना है कि आप, क्योंकि यह पाठ फ़ाइल में टिप्पणी के रूप में व्यवहार किया जाता है हैश प्रतीक के लिए यूनिकोड वर्ण (UTF-8) का उपयोग करने की जरूरत है।

सभी दस्तावेज के अनुसार, यह आपकी समस्या को ठीक करना चाहिए और # और @ प्रतीकों को अल्फा वर्णों के रूप में देखना चाहिए, जो आप जिस व्यवहार को ढूंढ रहे हैं उसे प्रदान करेंगे।

+2

धन्यवाद Paige, देर रात देर से पता चला, जैसा कि आप द्वारा उल्लेख किया गया है। – sesmic

+0

मैंने उपर्युक्त सभी को पुनरारंभ किया और हलर सेवा को फिर से शुरू किया, फिर भी # पिज्जा और पिज्जा की खोज एक ही परिणाम, किसी भी सुराग या किसी और कदम का पालन करना चाहिए? – PepperoniPizza

+0

क्या आपने कॉन्फ़िगरेशन परिवर्तन करने के बाद अपने दस्तावेज़ों को पुन: संशोधित किया था? जब भी आप schema.xml फ़ाइल में परिवर्तन करते हैं जो दस्तावेज़ों को अनुक्रमित करने के तरीके को प्रभावित करते हैं, तो आपको अनुक्रमित शर्तों में परिवर्तनों को प्रतिबिंबित करने के लिए दस्तावेज़ों को दोबारा जोड़ना होगा। –

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