2013-08-16 3 views
7

मुझे सौर में विशेष वर्णों के साथ एक खोज के साथ समस्या है। मेरे दस्तावेज़ में एक फ़ील्ड "शीर्षक" है और कभी-कभी यह "टाइटैनिक - 1 999" जैसा हो सकता है (इसमें चरित्र "-" है)। जब मैं "-" के साथ सोलर में खोज करने का प्रयास करता हूं तो मुझे 400 त्रुटि मिलती है। मैंने चरित्र से बचने की कोशिश की है, इसलिए मैंने कुछ कोशिश की - "और" \ ""। उस परिवर्तन के साथ solr मुझे एक त्रुटि के साथ प्रतिक्रिया नहीं करता है, लेकिन यह 0 परिणाम देता है।विशेष वर्णों के साथ सोलर में खोजें

कैसे मैं कि विशेष वर्ण के साथ Solr व्यवस्थापक में खोज सकते हैं (जैसे कुछ "-" या " '" ???

सादर

अद्यतन यहाँ आप मेरे वर्तमान Solr योजना देख सकते हैं https://gist.github.com/cpalomaresbazuca/6269375

मेरे खोज क्षेत्र "शीर्षक" करने के लिए है Schema.xml से

अंश:।

... 
<!-- A general text field that has reasonable, generic 
    cross-language defaults: it tokenizes with StandardTokenizer, 
    removes stop words from case-insensitive "stopwords.txt" 
    (empty by default), and down cases. At query time only, it 
    also applies synonyms. --> 
    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
      <tokenizer class="solr.StandardTokenizerFactory"/> 
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
      <!-- in this example, we will only use synonyms at query time 
      <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> 
      --> 
      <filter class="solr.LowerCaseFilterFactory"/> 

     </analyzer> 
     <analyzer type="query"> 
      <tokenizer class="solr.StandardTokenizerFactory"/> 
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
      <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 

     </analyzer> 
    </fieldType> 
... 
<field name="Title" type="text_general" indexed="true" stored="true"/> 
+0

क्या आप खोज करते समय उलटा कॉमा लगाते हैं? पसंद की तरह? क्यू = शीर्षक: "टाइटैनिक - 1 999"। इसे उलटा कॉमा में डालने से सटीक खोज करना चाहिए –

+0

इस क्षेत्र के लिए आपकी स्कीमा कैसी दिखती है? मुझे यह जानने में दिलचस्पी है कि इस क्षेत्र के लिए आपके पास कौन सी फील्ड परिभाषा है। –

+0

<फ़ील्ड नाम = "शीर्षक" प्रकार = "text_general" संग्रहित = "सत्य" अनुक्रमित = "सत्य" /> –

उत्तर

0

आपके सटीक वाक्यांश यह दौर औंधा अल्पविराम के डाल खोजने के लिए:

select?q=title:"Titanic - 1999" 

आप केवल उस विशेष चरित्र के लिए खोज करना चाहते हैं तो आप इसे से बचने के लिए की आवश्यकता होगी:

select?q=title:\- 

यह भी जांचें: Special characters (-&+, etc) not working in SOLR Query

यदि आप बिल्कुल जानते हैं % 2 डी के साथ है, इसलिए जब आप खोज, जब तक आप% की खोज के रूप में - जो विशेष वर्ण आप तो उपयोग करना चाहते हैं न आप regex-normalize.xml

<regex> 
    <pattern>&#x2D;</pattern> 
    <substitution>%2D</substitution> 
</regex> 

यह सब बदल देगा करने के लिए इस जोड़ सकते हैं "" "-" के बजाय 2 डी ठीक काम करेगा

+0

मैं कोशिश की है: चयन q = शीर्षक: \ - लेकिन यह अभी भी रिटर्न 0 परिणामों :( मैं कैसे जान सकते हैं अगर चरित्र "-" अनुक्रमित नहीं किया जा रहा है ?. – shinjidev

+0

प्रयास करें कि मैं क्या सुझाव दिया दूसरी छमाही में, regex-normalize.xml बदल रहा है। मैंने इसे स्वयं करने की कोशिश की और यह पूरी तरह से काम करता है –

+0

प्रश्न के लिए खेद है, लेकिन मुझे वह फ़ाइल कहां मिल सकती है ??? मुझे यह नहीं मिला – shinjidev

7

आप शीर्षक विशेषता के लिए मानक text_general फ़ील्ड का उपयोग कर रहे हैं। यह एक अच्छा विकल्प नहीं हो सकता है। text_general टेक्स्ट के विशाल भाग (या कम से कम वाक्यों) के लिए होना चाहिए और नाम या शीर्षक के सटीक मिलान के लिए इतना नहीं है।

समस्या यह है कि text_generalStandardTokenizerFactory का उपयोग करता है।

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
      <tokenizer class="solr.StandardTokenizerFactory"/> 
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
      <!-- in this example, we will only use synonyms at query time 
      <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> 
      --> 
      <filter class="solr.LowerCaseFilterFactory"/> 

     </analyzer> 
     <analyzer type="query"> 
      <tokenizer class="solr.StandardTokenizerFactory"/> 
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
      <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 

     </analyzer> 
    </fieldType> 

StandardTokenizerFactory निम्नलिखित है:

एक अच्छा सामान्य प्रयोजन tokenizer कि कई बाहरी पात्रों स्ट्रिप्स और सार्थक मूल्यों के लिए टोकन प्रकार निर्धारित करता है। टोकन प्रकार केवल बाद के टोकन फ़िल्टर के लिए उपयोगी हैं जो समान टोकन प्रकारों के प्रकार से अवगत हैं।

इसका मतलब है कि '-' चरित्र पूरी तरह अनदेखा कर दिया जाएगा और स्ट्रिंग को टोकननाइज़ करने के लिए उपयोग किया जाएगा।

"कोंग-फु" को "कोंग" और "फू" के रूप में दर्शाया जाएगा। '-' गायब हो जाता है।

यह भी समझाता है कि क्यों select?q=title:\- यहां काम नहीं करेगा।

बजाय

StandardTokenizerFactory आप solr.WhitespaceTokenizerFactory इस्तेमाल कर सकते हैं, जो केवल शब्दों के यथार्थ मिलान के लिए खाली स्थान के पर विभाजन:

एक बेहतर फिटिंग क्षेत्र प्रकार चुनें। तो शीर्षक विशेषता के लिए अपना खुद का फ़ील्ड प्रकार बनाना एक समाधान होगा।

सोलर में एक न्यूनतम क्षेत्र प्रकार है जिसे text_ws कहा जाता है। आपकी आवश्यकताओं के आधार पर यह पर्याप्त हो सकता है।

1

मैंने इसे पूरा करने में काफी समय बिताया। सोलर में विशेष पात्रों से पूछने के लिए यहां एक स्पष्ट कदम-दर-चरण चीजें हैं। उम्मीद है कि यह किसी की मदद करता है।

  1. schema.xml फ़ाइल संपादित करें और solr.TextField को खोजें जो आप का उपयोग कर रहे हैं।
  2. दोनों के अंतर्गत, "सूचकांक" और क्वेरी "विश्लेषक WordDelimiterFilterFactory और जोड़ने types="characters.txt" कुछ की तरह संशोधित:

    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter catenateAll="0" catenateNumbers="0" catenateWords="0" class="solr.WordDelimiterFilterFactory" generateNumberParts="1" generateWordParts="1" splitOnCaseChange="1" types="characters.txt"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter catenateAll="0" catenateNumbers="0" catenateWords="0" class="solr.WordDelimiterFilterFactory" generateNumberParts="1" generateWordParts="1" splitOnCaseChange="1" types="characters.txt"/> 
    </analyzer> 
    </fieldType> 
    
  3. सुनिश्चित करें कि आप ऊपर दिखाए गए रूप tokenizer रूप WhitespaceTokenizerFactory का उपयोग

  4. । आपकी characters.txt फ़ाइल में प्रविष्टियां हो सकती हैं-

    \# => ALPHA 
    @ => ALPHA 
    \u0023 => ALPHA 
           ie:- pointing to ALPHA only. 
    
  5. दर्ज किए गए वर्णों के लिए डेटा, पुन: अनुक्रमणिका और क्वेरी साफ़ करें। यह काम करेगा।

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