2011-02-18 10 views
8

He estado jugando con ElasticSearch para un nuevo proyecto mío. He configurado los analizadores por defecto para usar el ngram tokenfilter. Este es mi archivo elasticsearch.yml:ElasticSearch n-gram tokenfilter no encuentra palabras parciales

index: 
analysis: 
    analyzer: 
     default_index: 
      tokenizer: standard 
      filter: [standard, stop, mynGram] 
     default_search: 
      tokenizer: standard 
      filter: [standard, stop] 

    filter: 
     mynGram: 
      type: nGram 
      min_gram: 1 
      max_gram: 10 

He creado un nuevo índice y añade el siguiente documento a la misma:

$ curl -XPUT http://localhost:9200/test/newtype/3 -d '{"text": "one two three four five six"}' 
{"ok":true,"_index":"test","_type":"newtype","_id":"3"} 

Sin embargo, cuando la búsqueda utilizando la consulta text:hree o text:ive o cualquier otro parcial términos, ElasticSearch no devuelve este documento. Devuelve el documento solo cuando busco el término exacto (como text:two).

También he intentado cambiar el archivo de configuración de modo que default_search también use el filtro de token ngram, pero el resultado fue el mismo. ¿Qué estoy haciendo mal aquí y cómo lo corrijo?

+0

Hola Brian, para que esté completo, ¿podría publicar la configuración corregida? Estoy teniendo el mismo problema. – Rich

Respuesta

9

No estoy seguro acerca de la configuración predeterminada_ *. Pero la aplicación de un mapeo que especifica index_analyzer y search_analyzer funciona:

curl -XDELETE localhost:9200/twitter 
curl -XPOST localhost:9200/twitter -d ' 
{"index": 
    { "number_of_shards": 1, 
    "analysis": { 
     "filter": { 
        "mynGram" : {"type": "nGram", "min_gram": 2, "max_gram": 10} 
       }, 
     "analyzer": { "a1" : { 
        "type":"custom", 
        "tokenizer": "standard", 
        "filter": ["lowercase", "mynGram"] 
        } 
        } 
    } 
    } 
} 
}' 

curl -XPUT localhost:9200/twitter/tweet/_mapping -d '{ 
    "tweet" : { 
     "index_analyzer" : "a1", 
     "search_analyzer" : "standard", 
     "date_formats" : ["yyyy-MM-dd", "dd-MM-yyyy"], 
     "properties" : { 
      "user": {"type":"string", "analyzer":"standard"}, 
      "message" : {"type" : "string" } 
     } 
    }}' 

curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{ 
    "user" : "kimchy", 
    "post_date" : "2009-11-15T14:12:12", 
    "message" : "trying out Elastic Search" 
}' 

curl -XGET localhost:9200/twitter/_search?q=ear 
curl -XGET localhost:9200/twitter/_search?q=sea 

curl -XGET localhost:9200/twitter/_mapping 
+1

Bueno, en realidad renuncié a la búsqueda elástica y ahora tengo la configuración de Solr funcionando perfectamente. Probaré esta solución cuando tenga algo de tiempo y veremos cómo funciona. – asleepysamurai

+1

He enviado una edición a esta respuesta porque es engañosa e intenta aplicar la asignación a todo el índice y debe aplicarlo al tipo. – Travis

+0

curl -XPUT localhost: 9200/twitter/_mapping -d '{debe ser curl -XPUT localhost: 9200/twitter/tweet/_mapping -d' { – rado

1

debe comprobar el API de mapas llegar a ver si su asignación se ha aplicado: http://www.elasticsearch.org/guide/reference/api/admin-indices-get-mapping.html

Por cierto, se ha dicho en la lista de correo que cuando un índice ya contiene documentos, las asignaciones que pone en el elasticsearch.yml no se aplican. Primero debes limpiar tu índice.

He intentado ngrams con ES y funciona bien para mí.

Cuestiones relacionadas