2011-06-03 26 views
9

Estoy tratando de configurar un índice ElasticSearch con diferentes analizadores para los campos individuales. Sin embargo, parece que no puedo encontrar una forma de configurar analizadores específicos de campo; así es como creo mi (prueba) Índice:El mapeo ElasticSearch no funciona

curl -XPOST localhost:9200/twitter 
curl -XPUT 'http://localhost:9200/twitter/tweet/_mapping' -d ' 
{ 
    "tweet" : { 
     "properties" : { 
      "message" : { 
       "type" : "string", 
       "search_analyzer" : "snowball", 
       "index_analyzer" : "snowball" 
      } 
     } 
    } 
}' 

Si leo la documentación correcta, entonces esto debe crear el índice 'Twitter' con el tipo 'tuit', y el contenido del campo 'mensaje' debe ser analizado a través del analizador de stemball bola de nieve. Para probar esto, probé las siguientes consultas:

curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{ 
    "message" : "Look, a fighting War-Unicorn!" 
}' 
curl -XGET localhost:9200/twitter/_search?q=fight 

Si no estoy equivocado, entonces esto debe devolver un golpe, como la lucha es el tallo para la lucha; el problema es que no, recibo cero hits. Parece que ElasticSearch ignora por completo la asignación (aunque ElasticSearch acepta todas estas consultas, ya que 'ok' vuelve para cada una de ellas).

Ya he intentado reemplazar el analizador predeterminado con un analizador de bolas de nieve, y luego funciona; Lo que pasa es que necesito totalmente tener analizadores específicos de campo, así que esto no me va a ayudar. También probé diferentes analizadores y cosas como configurar "índice" a "no", pero fue en vano.

¿Qué estoy haciendo mal?

Respuesta

11

Para usar un analizador específico de campo, necesita especificar este campo en la consulta. De lo contrario, se utiliza el analizador predeterminado. Trate

curl -XGET 'localhost:9200/twitter/_search?q=message:fight' 

o

curl -XGET 'localhost:9200/twitter/_search?df=message&q=looking' 
+1

bien, eso es para la búsqueda analizador ... pero ¿no debería la bola de nieve index_analyzer reducir "pelear" para "pelear", como lo hace cuando ejecuta la oración directamente a través de la API de análisis? En ese caso, la búsqueda de "pelea" devolvería un golpe, independientemente del analizador de búsqueda utilizado, ¿no es así? Y, más importante, ¿qué sucede si aún no sé en qué campo buscar? Aquí solo tengo uno, está bien, pero al final necesitaré varios y los buscaré. – Felix

+1

analizador de bolas de nieve reduce la "lucha" para "luchar" en el campo "mensaje" de hecho. Sin embargo, si no especifica un campo en su búsqueda, está buscando un campo especial "_all" que indexe el contenido del campo "mensaje" (y todos los demás campos, si lo tiene) pero este contenido se analiza mediante el analizador predeterminado . – imotov

+0

bien, eso lo entiendo, gracias por explicarme, @imotov! Aún así ... si el analizador de índices reduce "pelear" para "pelear", ¿no sería "luchar" el token que ES guarda e indexa y verifica contra las consultas de búsqueda? por lo tanto, ¿la búsqueda de "luchar" usando el analizador estándar no devolvería una coincidencia, si el texto fue indexado usando el analizador de bola de nieve? – Felix