2012-11-13 12 views
9

मुझे अपने एसओएलआर पता डेटाबेस के साथ एक समस्या के आसपास अपना सिर लेने का कठिन समय है।एसओएलआर 4.0 वर्णमाला क्रमबद्ध परेशानी

मैंने इसे उदाहरण फ़ाइलों से बनाया है। मैं मूल रूप से संशोधित स्कीमा के साथ उदाहरण कॉन्फ़िगरेशन चला रहा हूं।

Schema.xml:

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
<field name="_version_" type="long" indexed="true" stored="true" required="false" multiValued="false" /> 

<field name="givenname_s" type="text_de" indexed="true" stored="true" required="true" multiValued="false" /> 
<field name="middleinitial_s" type="text_de" indexed="false" stored="true" required="false" multiValued="false" /> 
<field name="surname_s" type="text_de" indexed="true" stored="true" required="true" multiValued="false" /> 
<field name="gender_s" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
<field name="pictureuri_s" type="string" indexed="false" stored="true" required="false" multiValued="false" /> 
<field name="function_s" type="text_de" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="organizationalunit_s" type="text_general" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="organizationalunitdescription_s" type="text_de" indexed="false" stored="true" required="false" multiValued="false" /> 
<field name="company_s" type="text_de" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="street_s" type="text_de" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="streetnumber_s" type="int" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="postcode_s" type="int" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="city_s" type="text_de" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="building_s" type="text_de" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="roomnumber_s" type="int" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="country_s" type="text_en" indexed="true" stored="true" required="true" multiValued="false" /> 
<field name="countrycode_s" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
<field name="emailaddress_s" type="string" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="phone1_s" type="string" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="phone2_s" type="string" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="mobile_s" type="string" indexed="true" stored="true" required="false" multiValued="false" /> 
<field name="fax_s" type="string" indexed="true" stored="true" required="false" multiValued="false" /> 

मैं post.jar के लिए निम्न तरह 20.000 के बारे में यादृच्छिक परीक्षण डेटासेट धक्का द्वारा डेटाबेस को आबाद करने हूँ:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<add> 
    <doc> 
     <field name="id">1352498443_1</field> 
     <field name="givenname_s">Aynur</field> 
     <field name="middleinitial_s"/> 
     <field name="surname_s">Lehnen</field> 
     <field name="gender_s">F</field> 
     <field name="pictureuri_s">dummy_assets/female.jpg</field> 
     <field name="function_s">Zugschaffner/in</field> 
     <field name="organizationalunit_s">P 07</field> 
     <field name="organizationalunitdescription_s">Lorem Ipsum sadipscing voluptua ipsum invidunt dolor et dolore invidunt sed consetetur accusam dolore Lorem tempor.</field> 
     <field name="company_s">Lorem Lagna Epsum Emet</field> 
     <field name="street_s">Erlenweg</field> 
     <field name="streetnumber_s">82</field> 
     <field name="postcode_s">76297</field> 
     <field name="city_s">Lübeck</field> 
     <field name="building_s"/> 
     <field name="roomnumber_s">242</field> 
     <field name="country_s">GERMANY</field> 
     <field name="countrycode_s">DE</field> 
     <field name="emailaddress_s">[email protected]</field> 
     <field name="phone1_s">0392984823</field> 
     <field name="phone2_s">0124111417</field> 
     <field name="mobile_s">0325117132</field> 
     <field name="fax_s">0171459177</field> 
    </doc> 
</add> 

लेकिन जब retreiving डेटा मुझे वर्णमाला क्रमबद्ध करने में समस्याएं प्रतीत होती हैं। झुकाव क्वेरी पर विचार करें:

{ 
    "responseHeader": { 
     "status": 0, 
      "QTime": 5, 
      "params": { 
      "sort": "surname_s asc", 
       "fl": "surname_s", 
       "indent": "true", 
       "wt": "json", 
       "q": "city_s:berlin" 
     } 
    }, 
     "response": { 
     "numFound": 1094, 
     "start": 0, 
     "docs": [{ 
      "surname_s": "Weil" 
     }, { 
      "surname_s": "Abel" 
     }, { 
      "surname_s": "Adam" 
     }, { 
      "surname_s": "Ade" 
     }, { 
      "surname_s": "Adrian" 
     }, { 
      "surname_s": "Aigner" 
     }, { 
      "surname_s": "Aigner" 
     }, { 
      "surname_s": "Alber" 
     }, { 
      "surname_s": "Alber" 
     }, { 
      "surname_s": "Albers" 
     }] 
    } 
} 

स्थिति पर "वील" क्यों है, जबकि शेष डेटा सही ढंग से क्रमबद्ध किया गया है?

उत्तर

14

मेरा मानना ​​है कि text_de फ़ील्ड प्रकार में लागू किए जा रहे कुछ अतिरिक्त विश्लेषक इस सॉर्टिंग व्यवहार का कारण हैं। मेरे अनुभव में, तारों को सॉर्ट करते समय सर्वोत्तम परिणामों के लिए alphaOlySort फ़ील्ड टाइप का उपयोग करना है जो नीचे दिखाए गए उदाहरण schema.xml के साथ आता है।

<fieldType name="alphaOnlySort" class="solr.TextField" sortMissingLast="true" omitNorms="true"> 
    <analyzer> 
    <!-- KeywordTokenizer does no actual tokenizing, so the entire 
     input string is preserved as a single token 
     --> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <!-- The LowerCase TokenFilter does what you expect, which can be 
     when you want your sorting to be case insensitive 
     --> 
    <filter class="solr.LowerCaseFilterFactory" /> 
    <!-- The TrimFilter removes any leading or trailing whitespace --> 
    <filter class="solr.TrimFilterFactory" /> 
    <!-- The PatternReplaceFilter gives you the flexibility to use 
     Java Regular expression to replace any sequence of characters 
     matching a pattern with an arbitrary replacement string, 
     which may include back references to portions of the original 
     string matched by the pattern. 

     See the Java Regular Expression documentation for more 
     information on pattern and replacement string syntax. 

     http://java.sun.com/j2se/1.6.0/docs/api/java/util/regex/package-summary.html 
     --> 
    <filter class="solr.PatternReplaceFilterFactory" 
      pattern="([^a-z])" replacement="" replace="all" 
    /> 
    </analyzer> 
</fieldType> 

मैं एक नया क्षेत्र बनाने और उसके बाद की तरह कुछ copyField के माध्यम से surname_s से मूल्य को कॉपी, की सिफारिश करेंगे निम्नलिखित:

<field name="surname_s_sort" type="alphaOnlySort" indexed="true" stored="false" required="false" multiValued="false" /> 

<copyField source="surname_s" dest="surname_s_sort"/> 

नोट: वहाँ में मान संग्रहीत की कोई जरूरत नहीं है surname_s_sort फ़ील्ड, इसलिए stored="false" विशेषता, जब तक कि आप इसे उपयोगकर्ताओं को प्रदर्शित करने की अपेक्षा न करें।

फिर आप surname_s_sort पर सॉर्ट करने के लिए बस अपनी क्वेरी बदल सकते हैं।

+1

किसी और को यह समस्या होने पर ध्यान दें कि जब कोई दस्तावेज़ अनुक्रमित होता है तो कॉपीफ़िल्फ़ होता है। –

+2

आपकी धारणा बिल्कुल सही है। "Weil" जर्मन विश्लेषक के लिए एक स्टॉप शब्द है। –

+0

बिल्कुल सही !! धन्यवाद पेगे कुक। इसने काम कर दिया। – atpatil11

4

सॉर्टिंग बहुविकल्पीय और टोकनयुक्त क्षेत्रों पर अच्छी तरह से काम नहीं करती है।

Documentation-
अनुक्रमित दस्तावेज़ के "स्कोर" पर किया जा सकता है, या किसी बहु-मूल्यांकित = "false" अनुक्रमित = "true" मैदान पर उस क्षेत्र प्रदान की है या तो गैर tokenized (यानी: कोई विश्लेषक है) या एक विश्लेषक का उपयोग करता है जो केवल एक शब्द का उत्पादन करता है (यानी: कीवर्ड टॉकनाइज़र का उपयोग करता है)

फ़ील्ड प्रकार के रूप में स्ट्रिंग का उपयोग करें और शीर्षक फ़ील्ड को नए फ़ील्ड में कॉपी करें।

<field name="surname_s_sort" type="string" indexed="true" stored="false"/> 

<copyField source="surname_s" dest="surname_s_sort" /> 

जैसा कि @ पेएज ने उत्तर दिया है कि आपके पास कीवर्ड टोकननाइज़र हो सकता है, कम केस फ़िल्टर जो फ़ील्ड को टोकन नहीं करते हैं।

0

मेरे पास समान समस्याएं थीं और मैंने अल्फाऑनलीस्टॉर्ट की कोशिश की। यह कुछ हिस्सों के लिए काम करता है, लेकिन यह क्रमबद्ध परिणामों को गड़बड़ करना शुरू करता है जब फ़ील्ड में मूल्य, -/रिक्त स्थान इत्यादि होते हैं।

तो परिणाम की तरह कुछ था

  1. /abc
  2. /ABC2

तो मैं फ़ील्ड प्रकार लोअरकेस का उपयोग कर समाप्त हो गया। यह पहले से ही था इसलिए मुझे लगा कि यह एक डिफ़ॉल्ट प्रकार है। मैंने कॉपी फील्ड निर्माण का उपयोग किया था, इसलिए मेरी अंतिम कॉन्फ़िगरेशन थी:

<schema> 
    <fieldType name="lowercase" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     </analyzer> 
    </fieldType> 
    <fields> 
     <field name="job_name_sort" type="lowercase" indexed="true" stored="false" required="false"/> 
    </fields> 
    <copyField source="job_name" dest="job_name_sort"/> 
</schema> 
संबंधित मुद्दे