ElasticSearch n-граммовый токен-фильтр не находит частичные слова - PullRequest
9 голосов
/ 18 февраля 2011

Я играл с ElasticSearch для моего нового проекта.Я установил анализаторы по умолчанию для использования токена-фильтра ngram.Это мой файлasticsearch.yml:

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

Я создал новый индекс и добавил в него следующий документ:

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

Однако при поиске по запросу text:hreeили text:ive, или любые другие частичные условия, ElasticSearch не возвращает этот документ.Он возвращает документ только тогда, когда я ищу точный термин (например, text:two).

Я также попытался изменить файл конфигурации так, чтобы default_search также использовал фильтр токенов ngram, но результат был таким же.Что я здесь не так делаю и как мне это исправить?

Ответы [ 2 ]

10 голосов
/ 15 марта 2011

Не уверен насчет настроек по умолчанию_ *. Но применение сопоставления, которое указывает index_analyzer и search_analyzer, работает:

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 голос
/ 03 июля 2012

Вы должны проверить API get mapping, чтобы увидеть, было ли применено ваше сопоставление: http://www.elasticsearch.org/guide/reference/api/admin-indices-get-mapping.html

Кстати, в списке рассылки сказано, что когда индекс уже содержит документы, сопоставления, которые вы помещаетеasticsearch.yml не применяются.Сначала вам нужно почистить ваш индекс.

Я пробовал ngrams с ES, и он прекрасно работает для меня.

...