2012-09-07 5 views
6

estoy usando el analizador de bola de nieve en mi búsqueda cadena de consulta ... al igual queElasticsearch con el analizador de bola de nieve sólo devuelve resultados de la palabra de tallo

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

esto realmente funciona, pero hace algo raro ... buscar " pelear "arrojará resultados para" pelear "pero ignorará los resultados de" pelear ". Una búsqueda de "tripulaciones" arrojará resultados para "tripulación" pero no "tripulaciones", también una búsqueda de "tripulación" también ignora los resultados para "tripulaciones" ...

¿Alguien sabe lo que está pasando?

+0

¿Lo has resuelto? ¿Puedo saber si mi respuesta fue útil? – javanna

+0

Configuré el analizador predeterminado como bola de nieve y me encargué de eso, pero sigo sin entender por qué no funcionó configurarlo en la cadena de consulta. ¿En qué se diferencia la indexación de que una búsqueda de lucha en un caso (el analizador predeterminado configurado en bola de nieve) puede realmente levantar la publicación de "pelea" pero la otra (solo especificarla en la cadena de consulta) no lo hace? – concept47

+0

Al igual que escribí en mi respuesta, si aplica la derivación solo en el momento de la consulta, termina buscando los tallos dentro de un campo que no se detuvo durante la indexación. ¡Me alegro de que hayas resuelto! – javanna

Respuesta

11

La puntería tiene sentido cuando la aplica tanto en tiempo de índice como en tiempo de consulta. Ahora lo aplica en el momento de la consulta, para que pueda buscar los tallos de las palabras que forman parte de la consulta. Pero supongo que el índice no contiene los tallos ya que no se ha aplicado desde el momento del índice. En realidad, está buscando en el campo _all ya que no especificó ningún nombre de campo ni en su consulta ni en el atributo default_field (o fields) admitido por query_string. El campo _all se analiza de forma predeterminada con StandardAnalyzer.

Existen diferentes formas de resolver este problema. Yo personalmente decidiría un conjunto de campos en los que desea buscar en su consulta y aplicarlos en su mapeo. Después de eso, no necesita especificar el analizador en su consulta, ya que se usará el analizador configurado para el campo en el que está buscando.

Avíseme si la respuesta es lo suficientemente clara.

+0

Eso tiene mucho sentido. Pero, ¿por qué ignoraría un elemento que coincide exactamente con la consulta? (es decir, una búsqueda de "pelea" no devuelve una publicación titulada "pelea", sino que devuelve una publicación titulada "pelea") – concept47

+0

porque cuando se aplica a raíz de la consulta la lucha se convierte en pelea. Realmente estás buscando pelea en lugar de luchar. ;) – javanna

+0

por lo que significa que mi problema aún existiría aunque usara la leyenda en el índice? ¿Cómo lo hago para que haga una búsqueda tanto en la palabra derivada como en la consulta real ... Sphinx lo hace automáticamente, un poco sorprendido por la implementación aquí – concept47

2

Gracias a @javanna por orientarme en la dirección correcta. Lo resolví configurando el analizador para el campo _all en snowball. Vea this doc para más detalles.

estoy usando la gema de neumáticos Ruby, y yo era capaz de especificar el mapeo en mi modelo de la siguiente manera:

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

he formateado mi consulta exactamente igual que en la pregunta original.

Cuestiones relacionadas