Фраза подсказка с фонетическим плагином в Elasticsearch 5.5
Я разрабатываю функцию поиска в веб-приложении и использую Elasticsearch 5.5.3 (я не могу использовать более новые версии, 5.5.3 требовалось от клиента).
Я также использую функцию предложения фразы. Прямо сейчас он выполняет поиск только по заданной строке, но если строка подсказки доступна, он заменяет поиск предложенной строкой (в основном он не включает другие строки в поиск).
Дело в том, что я пытаюсь использовать фонетический плагин, чтобы предлагать похожие строки с похожими по звучанию словами (например, если кто-то ищет "Shile", он должен предложить "Chile", потому что они звучат одинаково на испанском языке). Но я еще не достиг этого, я не уверен, что я делаю неправильно.
Вот отображение, которое у меня было до того, как я пытался его реализовать (хотя я включаю анализатор, который я создал для этого, 'metaphone_analyzer'):
{
"searches": {
"aliases": {},
"mappings": {
"document": {
"properties": {
"description": {
"type": "text",
"store": true
},
"detail": {
"type": "text",
"store": true,
"copy_to": [
"suggest_field"
]
},
"language_code": {
"type": "text"
},
"name": {
"type": "text",
"store": true,
"copy_to": [
"suggest_field"
]
},
"suggest_field": {
"type": "text"
},
"title": {
"type": "text",
"store": true,
"copy_to": [
"suggest_field"
]
}
}
}
},
"settings": {
"index": {
"number_of_shards": "5",
"provided_name": "searches",
"creation_date": "1532112095449",
"analysis": {
"filter": {
"shingle_filter": {
"max_shingle_size": "3",
"min_shingle_size": "2",
"type": "shingle"
},
"dbl_metaphone": {
"type": "phonetic",
"encoder": "double_metaphone"
},
"es_filter": {
"type": "stop",
"stopwords": "_spanish_"
},
"en_filter": {
"type": "stop",
"stopwords": "_english_"
}
},
"analyzer": {
"default": {
"filter": [
"lowercase",
"asciifolding",
"shingle_filter"
],
"char_filter": [
"html_strip"
],
"type": "custom",
"tokenizer": "standard"
},
"en_analyzer": {
"filter": [
"lowercase",
"asciifolding",
"en_filter"
],
"char_filter": [
"html_strip"
],
"type": "custom",
"tokenizer": "standard"
},
"es_analyzer": {
"filter": [
"lowercase",
"asciifolding",
"es_filter"
],
"char_filter": [
"html_strip"
],
"type": "custom",
"tokenizer": "standard"
},
"metaphone_analyzer": {
"filter": [
"lowercase",
"asciifolding",
"shingle_filter",
"dbl_metaphone"
],
"char_filter": [
"html_strip"
],
"type": "custom",
"tokenizer": "standard"
}
}
},
"number_of_replicas": "1",
"uuid": "SDykW954Q3egFIJEi1aA5w",
"version": {
"created": "5050399"
}
}
}
}
}
И вот мой запрос:
{
"suggest": {
"suggestion": {
"text": "search text",
"phrase": {
"max_errors": 2,
"field": "suggest_field",
"direct_generator": [
{
"suggest_mode": "missing",
"field": "suggest_field"
}
],
"gram_size": 3,
"size": 1,
"highlight": {
"pre_tag": "<strong>",
"post_tag": "</strong>"
}
}
}
},
"highlight": {
...
},
"query": {
...
}
}
По сути, я копирую некоторые поля в поле "offer_field", поэтому могу использовать подсказку сразу для нескольких полей.
Итак, какие идеи или направление я должен идти?
Благодарю.
PS: Просто для протокола, это веб-приложение Django, и я использую asticsearch-dsl, но я пишу последние запросы здесь для простоты.