2017-04-20 4 views
0

Ich habe einen Index für Berufe (Identifier + Beruf):SOLR und akzentuierte Zeichen

<field name="occ_id" type="int" indexed="true" stored="true" required="true" /> 
<field name="occ_tx_name" type="text_es" indexed="true" stored="true" multiValued="false" /> 


<!-- Spanish --> 
<fieldType name="text_es" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_es.txt" format="snowball" /> 
    <filter class="solr.SpanishLightStemFilterFactory"/> 
    </analyzer> 
</fieldType> 

Dies ist eine echte Abfrage, für drei Kennungen (1, 195 und 129):

curl -X GET "http://192.168.1.11:8983/solr/cyp_occupations/select?indent=on&q=occ_id:1+occ_id:195+occ_id:129&wt=json" 
{ 
    "responseHeader":{ 
    "status":0, 
    "QTime":1, 
    "params":{ 
     "q":"occ_id:1 occ_id:195 occ_id:129", 
     "indent":"on", 
     "wt":"json"}}, 
    "response":{"numFound":3,"start":0,"docs":[ 
     { 
     "occ_id":1, 
     "occ_tx_name":"Abogado", 
     "_version_":1565225103805906944}, 
     { 
     "occ_id":129, 
     "occ_tx_name":"Informático", 
     "_version_":1565225103843655680}, 
     { 
     "occ_id":195, 
     "occ_tx_name":"Osteópata", 
     "_version_":1565225103858335746}] 
    }} 

Zwei von ihnen haben Akzentbuchstaben, und einer nicht. Also lassen Sie sich von occ_tx_name suchen, ohne Akzente mit:

curl -X GET "http://192.168.1.11:8983/solr/cyp_occupations/select?indent=on&q=occ_tx_name:abogado&wt=json" 
{ 
    "responseHeader":{ 
    "status":0, 
    "QTime":1, 
    "params":{ 
     "q":"occ_tx_name:abogado", 
     "indent":"on", 
     "wt":"json"}}, 
    "response":{"numFound":1,"start":0,"docs":[ 
     { 
     "occ_id":1, 
     "occ_tx_name":"Abogado", 
     "_version_":1565225103805906944}] 
    }} 

curl -X GET "http://192.168.1.11:8983/solr/cyp_occupations/select?indent=on&q=occ_tx_name:informatico&wt=json" 
{ 
    "responseHeader":{ 
    "status":0, 
    "QTime":0, 
    "params":{ 
     "q":"occ_tx_name:informatico", 
     "indent":"on", 
     "wt":"json"}}, 
    "response":{"numFound”:1,”start":0,"docs":[ 
     { 
     "occ_id":129, 
     "occ_tx_name":"Informático", 
     "_version_":1565225103843655680}] 
    }} 


curl -X GET "http://192.168.1.11:8983/solr/cyp_occupations/select?indent=on&q=occ_tx_name:osteopata&wt=json" 
{ 
    "responseHeader":{ 
    "status":0, 
    "QTime":0, 
    "params":{ 
     "q":"occ_tx_name:osteopata", 
     "indent":"on", 
     "wt":"json"}}, 
    "response":{"numFound":0,"start":0,"docs":[] 
    }} 

Ich bin sehr ärgerlich über die Tatsache, dass die letzte Suche ‚osteopata‘ fehlschlägt, während ‚informatico‘ gelingen. Die Quelldaten für den Index ist eine einfache MySQL-Tabelle:

-- ----------------------------------------------------- 
-- Table `mydb`.`occ_occupation` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`occ_occupation` (
    `occ_id` INT UNSIGNED NOT NULL, 
    `occ_tx_name` VARCHAR(255) NOT NULL, 
    PRIMARY KEY (`occ_id`) 
ENGINE = InnoDB 

Die Sortierung der Tabelle ist „utf8mb4_general_ci“. Der Index wird mit DataImportHandler erstellt. Dies ist die Definition:

<dataConfig> 
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.1.11:3306/mydb" 
     user=“mydb” password=“mydb” /> 
    <document name="occupations"> 
     <entity name="occupation" pk="occ_id" 
      query="SELECT occ.occ_id, occ.occ_tx_name FROM occ_occupation occ WHERE occ.sta_bo_deleted = false"> 
      <field column="occ_id" name="occ_id" /> 
      <field column="occ_tx_name" name="occ_tx_name" /> 
     </entity> 
    </document> 
</dataConfig> 

Ich brauche einen Hinweis, das Problem zu erkennen. Kann mir jemand helfen? Danke im Voraus.

+0

Ich habe vergessen zu erwähnen, dass ich solr-6.3.0 benutze, und ich starte den Server mit diesem Befehl: solr start -a "-Duser.language = es -Duser.country = ES -Duser.timezone = Europa/Madrid " –

Antwort

0

Ok, ich habe das Quellproblem entdeckt. Ich habe mein SQL-Lade-Skript mit VI im Hex-Modus geöffnet.

Dies ist der Hex-Inhalt für 'Agrónomo' in einer INSERT-Anweisung: 41 67 72 6f cc 81 6e 6f 6d 6f.

6f cc 81!!!! This is "o COMBINING ACUTE ACCENT" UTF code!!!! 

Also das ist das Problem ... Es muss „c3 b3“ sein ... Ich bekomme die Literale Kopieren/Einfügen von einer Webseite, so dass die Quelle Zeichen auf dem Ursprung war das Problem.

Danke an euch beide, weil ich mehr über SOLRs Seele gelernt habe.

Grüße.

0

Ich denke nicht, dass mysql oder Ihre jvm-Einstellungen damit zu tun haben. Ich vermute, einer funktioniert und der andere wahrscheinlich nicht wegen der SpanishLightStemFilterFactory.

Der richtige Weg passend, egal zu erreichen die diakritischen Zeichen der folgenden verwenden:

<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 

Setzen Sie das vor Ihrem tokenizer in beiden Index- und Query Analyzer Ketten und jede diakritischen sollte auf die ASCII-Version konvertiert werden . Das würde es immer funktionieren lassen.

+0

Hallo. Es hat nicht funktioniert. Die gleichen Ergebnisse :( –

+0

gehen Sie auf die Registerkarte Analyse einen Blick auf ausführliche Ausgabe dieses Wortes im Bot-Index und Abfrage Seite – Persimmonium

+0

Es ist verrückt! In Solr Admin habe ich meinen Index ausgewählt, und klickte dann auf Schema Abschnitt. Dann habe ich ausgewählt das Feld 'occ_tx_name', und dann, "Load term info" Knopf, so kann ich Top 10 Begriffe aufgelistet. Ich habe 10 geändert, um alle Begriffe 278 zu sehen. Jeder Begriff in der Liste ist ein HTML-Anker, dieser Link zu einer SOLR-Abfrage und ich kann nicht glauben, dass ich sehe ... –

0

Nur solr.ASCIIFoldingFilterFactory Ihre Filteranalysekette hinzuzufügen, oder noch besser einen neuen Feldtyp erstellen:

<!-- Spanish --> 
<fieldType name="text_es_ascii_folding" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.ASCIIFoldingFilterFactory" /> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_es.txt" format="snowball" /> 
    <filter class="solr.SpanishLightStemFilterFactory"/> 
    </analyzer> 
</fieldType> 

Diese Filter konvertieren alphabetische, numerische und symbolische Unicode Zeichen, die nicht in dem Basic-Latin-Unicode-Block sind (die ersten 127 ASCII-Zeichen) zu ihren ASCII-Entsprechungen, wenn eine existiert.

Dies sollte Ihnen ermöglichen, die Suche anzupassen, selbst wenn das Akzentzeichen fehlt. Der Nachteil ist, dass Wörter wie "Cañon" und "Canon" jetzt gleichwertig sind und beide die gleichen Dokumente IIRC treffen.

+0

Hallo. Ich habe den Filter "solr.ASCIIFoldingFilterFactory" hinzugefügt, aber ich bekomme genau die gleichen Ergebnisse ... –

+0

Sie müssen die gesamte Sammlung neu indizieren – freedev

Verwandte Themen