2012-09-07 3 views
6

Sto usando l'analizzatore palla di neve nella mia ricerca stringa di domanda ... in questo modoelasticsearch con analizzatore di palla di neve restituisce solo i risultati per parola derivava

"query" : { 
     "query_string" : { 
     "query" : the-query-string-goes-here, 
     "default_operator" : "AND", 
     "analyzer" : "snowball" 
     } 
    } 

questo in realtà funziona ma fa qualcosa di strano ... la ricerca di " combattere "restituirà risultati per" combattere "ma ignora i risultati per" combattere ". Una ricerca di "equipaggi" restituirà risultati per "equipaggio" ma non "equipaggi", anche una ricerca per "equipaggio" ignora anche i risultati per "equipaggi" ...

Qualcuno sa cosa sta succedendo?

+0

Hai risolto? Posso sapere se la mia risposta è stata utile? – javanna

+0

Ho impostato l'analizzatore predefinito come palla di neve e questo si è preso cura di esso, ma continuo a non capire perché il solo settaggio nella stringa di query non ha funzionato. In che modo l'indicizzazione è diversa dal fatto che una ricerca di combattimento in un caso (l'analizzatore predefinito impostato su palla di neve) può effettivamente sollevare il post di "combattimento" ma l'altro (specificandolo solo nella stringa di query) non lo fa. – concept47

+0

Come ho scritto nella mia risposta, se si applica la derivazione solo al momento della query si finisce per cercare steli all'interno di un campo che non è stato arginato durante l'indicizzazione. Sono contento che tu abbia risolto! – javanna

risposta

11

La stagnazione ha senso quando la si applica sia all'indice che al tempo di interrogazione. Ora lo stai applicando al tempo di query, in modo da cercare i gambi delle parole che fanno parte della query. Ma suppongo che l'indice non contenga i gambi poiché non hai applicato lo stemming al tempo dell'indice. Stai effettivamente cercando nel campo _all poiché non hai specificato alcun nome campo né nella query né utilizzando l'attributo default_field (o fields) supportato da query_string. Il campo _all viene analizzato per impostazione predefinita utilizzando StandardAnalyzer.

Ci sono diversi modi per risolvere questo problema. Deciderei personalmente una serie di campi sui quali si desidera effettuare ricerche nella query e applicarli a essi che si verificano nella mappatura. Successivamente, non è necessario specificare l'analizzatore nella query poiché verrà utilizzato l'analizzatore configurato per il campo in cui si sta effettuando la ricerca.

Fammi sapere se la risposta è abbastanza chiara.

+0

Questo ha molto senso. Ma perché ignorerebbe un elemento che corrisponde esattamente alla query? (cioè una ricerca di "combattimento" non restituisce un post intitolato "combattimento" ma restituisce un post intitolato "lotta") – concept47

+0

perché quando si applica la derivazione alla query il combattimento diventa lotta. Stai davvero cercando di combattere invece di combattere. ;) – javanna

+0

quindi questo significa che il mio problema sarebbe ancora presente anche se ho usato lo stemmer sull'indice? Come faccio a fare una ricerca sia sulla parola stemmed che sulla query effettiva ... Sphinx lo fa automaticamente, un po 'sorpreso dall'implementazione qui – concept47

2

Grazie a @javanna per avermi indicato nella giusta direzione. Ho risolto questo problema impostando l'analizzatore per il campo _all su snowball. Vedere this doc per i dettagli.

sto usando la gomma gemma Ruby, e sono stato in grado di specificare la mappatura nel mio modello come segue:

mapping(_all: { analyzer: 'snowball' }) do 
    indexes :id, type: 'integer' 
    indexes :description 
    indexes :name, boost: 10 
end 

ho formattato la mia domanda esattamente come nella domanda iniziale.