Как искать часть слова с помощью ElasticSearch

Я недавно начал использовать ElasticSearch, и мне кажется, что я не могу заставить его искать часть слова.

Пример: у меня есть три документа из моей couchdb, проиндексированных в ElasticSearch:

{
  "_id" : "1",
  "name" : "John Doeman",
  "function" : "Janitor"
}
{
  "_id" : "2",
  "name" : "Jane Doewoman",
  "function" : "Teacher"
}
{
  "_id" : "3",
  "name" : "Jimmy Jackal",
  "function" : "Student"
} 

Итак, теперь я хочу найти все документы, содержащие «Doe»

curl http://localhost:9200/my_idx/my_type/_search?q=Doe

Это не возвращает никаких совпадений. Но если я ищу

curl http://localhost:9200/my_idx/my_type/_search?q=Doeman

, он возвращает один документ (John Doeman).

Я пробовал устанавливать разные анализаторы и разные фильтры в качестве свойств моего индекса. Я также пробовал использовать полноценный запрос (например:

{
  "query": {
    "term": {
      "name": "Doe"
    }
  }
}

) Но, похоже, ничего не работает.

Как я могу заставить ElasticSearch находить и Джона Доумана, и Джейн Доууман, когда я ищу «Доу»?

ОБНОВЛЕНИЕ

Я попытался использовать токенизатор и фильтр nGram, как предложил Игорь, вот так:

{
  "index": {
    "index": "my_idx",
    "type": "my_type",
    "bulk_size": "100",
    "bulk_timeout": "10ms",
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "tokenizer": "my_ngram_tokenizer",
          "filter": [
            "my_ngram_filter"
          ]
        }
      },
      "filter": {
        "my_ngram_filter": {
          "type": "nGram",
          "min_gram": 1,
          "max_gram": 1
        }
      },
      "tokenizer": {
        "my_ngram_tokenizer": {
          "type": "nGram",
          "min_gram": 1,
          "max_gram": 1
        }
      }
    }
  }
}

Проблема, с которой я столкнулся, заключается в том, что каждый запрос возвращает ВСЕ документы. Есть указатели? Документация ElasticSearch по использованию nGram невелика ...

116
задан Saeed Zhiany 1 December 2016 в 08:45
поделиться