2015-03-30 21 views
6

MODIFICA: per aggiungere a questo, i sinonimi sembrano funzionare con query querystring di base.Analizzatore sinonimo Elasticsearch non funzionante

"query_string" : { 
    "default_field" : "location.region.name.raw", 
    "query" : "nh" 
} 

Ciò restituisce tutti i risultati per New Hampshire, ma una query "match" per "nh" ha prodotto alcun risultato.


sto cercando di aggiungere i sinonimi ai miei campi di posizione nel mio Indice elastico, in modo che se faccio una ricerca posizione per "Mass", "Ma", o "Massachusetts" Prendo lo stesso risultati ogni volta. Ho aggiunto il filtro dei sinonimi alle mie impostazioni e modificato la mappatura per le posizioni. Qui ci sono le mie impostazioni:

analysis":{ 
    "analyzer":{ 
     "synonyms":{ 
      "filter":[ 
       "lowercase", 
       "synonym_filter" 
      ], 
     "tokenizer": "standard" 
    } 
}, 
"filter":{ 
    "synonym_filter":{ 
     "type": "synonym", 
     "synonyms":[ 
      "United States,US,USA,USA=>usa", 
      "Alabama,Al,Ala,Ala", 
      "Alaska,Ak,Alas,Alas", 
      "Arizona,Az,Ariz", 
      "Arkansas,Ar,Ark", 
      "California,Ca,Calif,Cal", 
      "Colorado,Co,Colo,Col", 
      "Connecticut,Ct,Conn", 
      "Deleware,De,Del", 
      "District of Columbia,Dc,Wash Dc,Washington Dc=>Dc", 
      "Florida,Fl,Fla,Flor", 
      "Georgia,Ga", 
      "Hawaii,Hi", 
      "Idaho,Id,Ida", 
      "Illinois,Il,Ill,Ills", 
      "Indiana,In,Ind", 
      "Iowa,Ia,Ioa", 
      "Kansas,Kans,Kan,Ks", 
      "Kentucky,Ky,Ken,Kent", 
      "Louisiana,La", 
      "Maine,Me", 
      "Maryland,Md", 
      "Massachusetts,Ma,Mass", 
      "Michigan,Mi,Mich", 
      "Minnesota,Mn,Minn", 
      "Mississippi,Ms,Miss", 
      "Missouri,Mo", 
      "Montana,Mt,Mont", 
      "Nebraska,Ne,Neb,Nebr", 
      "Nevada,Nv,Nev", 
      "New Hampshire,Nh=>Nh", 
      "New Jersey,Nj=>Nj", 
      "New Mexico,Nm,N Mex,New M=>Nm", 
      "New York,Ny=>Ny", 
      "North Carolina,Nc,N Car=>Nc", 
      "North Dakota,Nd,N Dak, NoDak=>Nd", 
      "Ohio,Oh,O", 
      "Oklahoma,Ok,Okla", 
      "Oregon,Or,Oreg,Ore", 
      "Pennsylvania,Pa,Penn,Penna", 
      "Rhode Island,Ri,Ri & PP,R Isl=>Ri", 
      "South Carolina,Sc,S Car=>Sc", 
      "South Dakota,Sd,S Dak,SoDak=>Sd", 
      "Tennessee,Te,Tenn", 
      "Texas,Tx,Tex", 
      "Utah,Ut", 
      "Vermont,Vt", 
      "Virginia,Va,Virg", 
      "Washington,Wa,Wash,Wn", 
      "West Virginia,Wv,W Va, W Virg=>Wv", 
      "Wisconsin,Wi,Wis,Wisc", 
      "Wyomin,Wi,Wyo" 
     ] 
    } 
} 

E il mapping per il campo location.region:

"region":{ 
    "properties":{ 
     "id":{"type": "long"}, 
     "name":{ 
      "type": "string", 
      "analyzer": "synonyms", 
      "fields":{"raw":{"type": "string", "index": "not_analyzed" }} 
     } 
    } 
} 

Ma l'analizzatore sinonimi non sembra essere di fare qualsiasi cosa. Questa query per esempio:

"match" : { 
    "location.region.name" : { 
     "query" : "Massachusetts", 
     "type" : "phrase", 
     "analyzer" : "synonyms" 
    } 
} 

Ciò restituisce centinaia di risultati, ma se sostituisco "Massachusetts" con "Ma" o "Mass" ottengo 0 risultati. Perché non funziona?

risposta

10

L'ordine dei filtri è

filter":[ 
    "lowercase", 
    "synonym_filter" 
] 

Quindi, se elasticsearch è "lettere minuscole" prima i gettoni, quando si esegue il secondo passo, synonym_filter, non corrisponderà a qualsiasi delle voci che avete definito .

per risolvere il problema, vorrei definire i sinonimi in minuscolo

+0

Voglio una domanda su meccanismo di lavoro dei filtri. Come funzionano i filtri nell'analizzatore? In questo esempio, i filtri in lettere minuscole funzionano e i token di ritorno e i token sono presi da synonym_filter, e sinonimi_filter funzionano e restituiscono nuovi token filtrati. Questo scenario è giusto o come? – hkulekci

+0

Sì, lo scenario che si sta descrivendo è corretto :) In generale, il tokenizzatore (in questo caso tokenizer standard) viene eseguito e quindi i filtri token nell'ordine definito (in questo caso prima in lettere minuscole e poi in sinonimo_filter). La documentazione lo spiega abbastanza bene http://www.elastic.co/guide/en/elasticsearch/reference/1.5/analysis-analyzers.html – moliware

+0

ok grazie. Li ho letti :) Voglio essere sicuro. – hkulekci

0

È possibile anche definire il filtro sinonimi come case insensitive:

 

    "filter":{ 
     "synonym_filter":{ 
      "type": "synonym", 
      "ignore_case" : "true", 
      "synonyms":[ 
       ... 
      ] 
     } 
    } 

Problemi correlati