2011-11-09 21 views
9

Estoy usando una biblioteca php de elasticsearch para indexar y encontrar documentos en mi sitio web. Este es el código para crear el índice:Elasticsearch no devuelve coincidencias de singular/plural

curl -XPUT 'http://localhost:9200/test/' -d ' 
{ 
    "index": { 
    "numberOfShards": 1, 
    "numberOfReplicas": 1 
    } 
}' 

Luego uso XPUT rizo para agregar documentos al índice y XGET para consultar el índice. Esto funciona bien, excepto por el hecho de que los singulares y los plurales de las palabras de consulta no coinciden en el índice al devolver los resultados. Por ejemplo, cuando busco "discusiones", las coincidencias para "discusión" no se devuelven y viceversa. ¿Por qué esto es tan? Pensé que esto se soluciona de forma predeterminada en elasticsearch. ¿Hay algo que tengamos que mencionar explícitamente para que coincida con las formas singular/plural?

Respuesta

6

De alguna manera bola de nieve que no está funcionando para mí ... estoy recibiendo errores como he mencionado en el comentario a @ imotov de respuesta . Utilicé el vástago porter y funcionó perfectamente para mí. Esta es la configuración que utilicé:

curl -XPUT localhost:9200/index_name -d ' 
{ 
"settings" : { 
    "analysis" : { 
     "analyzer" : { 
      "stem" : { 
       "tokenizer" : "standard", 
       "filter" : ["standard", "lowercase", "stop", "porter_stem"] 
      } 
     } 
    } 
}, 
"mappings" : { 
    "index_type_1" : { 
     "dynamic" : true, 
     "properties" : { 
      "field1" : { 
       "type" : "string", 
       "analyzer" : "stem" 
      }, 
      "field2" : { 
       "type" : "string", 
       "analyzer" : "stem" 
      } 
     } 
     } 
    } 
}' 
7

El analizador elascticsearch predeterminado no realiza la derivación y esto es lo que necesita para manejar plural/singular. Puedes probar a utilizar Snowball Analyzer para los campos de texto para ver si funciona mejor para su caso de uso:

curl -XPUT 'http://localhost:9200/test' -d '{ 
    "settings" : { 
     "index" : { 
      "number_of_shards" : 1, 
      "number_of_replicas" : 1 
     } 
    }, 
    "mappings" : { 
     "page" : { 
      "properties" : { 
       "mytextfield": { "type": "string", "analyzer": "snowball", "store": "yes"} 
      } 
     } 
    } 
}' 
+0

Gracias por la respuesta. Déjame probar esto y ver si funciona – Ninja

+0

Intenté esto y me aparece un error: "Mensaje: Error al cargar la configuración de clase [tipo] con valor [bola de nieve]". ¿Debería instalar algo más aquí? Si es así, ¿de qué y de dónde? – Ninja

+0

¿Qué versión de elasticsearch estás usando? Lo probé en 0.17 y en el maestro y funciona bien en ambos con la configuración predeterminada. ¿Modificó el comando de alguna manera? – imotov

6

Desde filtro 'porterStem' es demasiado sensible, es más adecuado si se utiliza el filtro '' minimal_english. 'porterStem' crea tokens similares para palabras tales como:

buscando 'Prueba' resultará en 'Prueba', 'Pruebas', 'Prueba', 'Comprobador' et. Alabama.

Pero 'minimal_english' solo arrojará 'Test' y 'Tests'.

+2

Su respuesta no fue marcada como correcta porque fue mucho más tarde que la primera, pero obviamente esta es una solución mucho mejor. El analizador de bolas de nieve es horriblemente impreciso. porterStem es un poco mejor y podría ser útil. kstem es aún menos sensible, y minimal_english es el menos sensible. Pero la bola de nieve es horrible. –

+2

No puedo encontrar minimal_english .. – Sekai

+0

@Sekai en su código java minimal_english se puede importar de org.apache.lucene.analysis.en.EnglishMinimalStemFilter y para usar en una consulta será "filter: minimal_english" –

Cuestiones relacionadas