2012-11-13 10 views
9

Sto attraversando un periodo difficile per risolvere il problema relativo al database degli indirizzi SOLR.Problemi di ordinamento alfabetico SOLR 4.0

Ho creato questo file dai file di esempio. Sto fondamentalmente eseguendo la configurazione di esempio con uno schema modificato.

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" /> 

sto popolamento del database spingendo circa 20.000 set di dati di test casuali come la seguente al post.jar: dati

<?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> 

Tuttavia quando retreiving Mi sembra di avere problemi con l'ordinamento alfabetico. Si consideri la query folowing:

{ 
    "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" 
     }] 
    } 
} 

Perché "Weil" sulla posizione di uno, mentre il resto dei dati sembra essere ordinati in modo corretto?

risposta

14

Credo che alcuni degli analizzatori aggiuntivi che vengono applicati nel tipo di campo text_de sono la causa di questo comportamento di ordinamento. Nella mia esperienza, per ottenere i migliori risultati durante l'ordinamento delle stringhe, utilizzare il fieldType alphaOlySort fornito con lo schema schema.xml illustrato di seguito.

<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> 

mi sento di raccomandare la creazione di un nuovo campo e poi copiare il valore da surname_s via copyField, qualcosa di simile al seguente:

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

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

Nota: non v'è alcuna necessità di memorizzare il valore in il campo surname_s_sort, quindi l'attributo stored="false", a meno che non si preveda di visualizzarlo agli utenti.

Quindi è possibile modificare la query per ordinare su surname_s_sort.

+1

Per chiunque abbia questo problema, notare che copyField si verifica quando un documento viene indicizzato. –

+2

La tua ipotesi è assolutamente giusta. "weil" è una parola d'ordine per GermanAnalyzer. –

+0

Perfetto !! Grazie Paige Cook. Ha funzionato. – atpatil11

4

L'ordinamento non funziona bene su campi multivalore e tokenizzati.

Documentation-
ordinamento può essere fatto sul "punteggio" del documento, o su qualsiasi multivalore = = campo "false" indicizzato "vero" a condizione che il campo è o non-token (cioè: non ha Analyzer) o utilizza un Analizzatore che produce solo un Termine singolo (es .: utilizza KeywordTokenizer)

Usa stringa come tipo di campo e copia il campo titolo nel nuovo campo.

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

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

Come @Paige risposto si può avere tokenizer parola chiave, filtri minuscole che non tokenize campo.

0

Ho avuto problemi simili e ho provato l'alphaOnlySort. Questo lavoro funziona in parte, ma inizia a rovinare i risultati di ordinamento quando il campo contiene valori come -,/spazi ecc.

Così il risultato è stato qualcosa di simile

  1. /abc
  2. aa
  3. /ABC2

Così ho finito per usare il tipo di campo in minuscolo. Era già lì quindi ho pensato che fosse un tipo predefinito. Ho usato la costruzione del campo di copia, quindi la mia configurazione finale era:

<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> 
Problemi correlati