Я недавно начал использовать 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
Он действительно возвращает один документ (Джон Доеман).
Я пробовал устанавливать разные анализаторы и разные фильтры в качестве свойств моего индекса. Я также пробовал использовать полноценный запрос (например:
{
"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 невелика ...