Elasticsearch: подсказка завершения не работает с пробелом Analyzer
Я новичок в поиске Elastic и пытаюсь создать одну демонстрацию подсказки завершения с помощью анализатора пробелов.
Согласно документации Whitespace Analyzer, он разбивает текст на термины всякий раз, когда встречается с пробельным символом. Итак, мой вопрос: работает ли он с подсказкой завершения?
Так что для моего префикса подсказки завершения: "ela", я ожидаю вывод как "Здравствуйте, упругий поиск".
Я знаю, что простое решение для этого состоит в том, чтобы добавить многопольный ввод как:
"suggest": {
"input": ["Hello","elastic","search"]
}
Однако, если это решение, то в чем смысл использования анализатора? Имеет ли смысл анализатор в подсказке завершения?
Мое отображение:
{
"settings": {
"analysis": {
"analyzer": {
"completion_analyzer": {
"type": "custom",
"filter": [
"lowercase"
],
"tokenizer": "whitespace"
}
}
}
},
"mappings": {
"my-type": {
"properties": {
"mytext": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"suggest": {
"type": "completion",
"analyzer": "completion_analyzer",
"search_analyzer": "completion_analyzer",
"max_input_length": 50
}
}
}
}
}
Мой документ:
{
"_index": "my-index",
"_type": "my-type",
"_id": "KTWJBGEBQk_Zl_sQdo9N",
"_score": 1,
"_source": {
"mytext": "dummy text",
"suggest": {
"input": "Hello elastic search."
}
}
}
Поисковый запрос:
{
"suggest": {
"test-suggest" : {
"prefix" :"ela",
"completion" : {
"field" : "suggest",
"skip_duplicates": true
}
}
}
}
Этот поиск не возвращает мне правильный вывод, но если я использую prefix = 'hel', я получаю правильный вывод: "Здравствуйте, упругий поиск".
Вкратце я хотел бы знать, работает ли анализатор пробелов с подсказкой завершения? и если есть способ, можете ли вы предложить мне.
PS: я уже искал эти ссылки, но не нашел полезного ответа.
ElasticSearch подсказка завершения Стандартный анализатор не работает
Какой Elasticsearch Analyzer использовать для этого подсказки завершения?
Я нахожу эту ссылку полезной Word-ориентированной подсказкой завершения (ElasticSearch 5.x). Однако они не используют подсказку завершения.
Заранее спасибо.
Джимми
0 ответов
Подсказчик завершения не может выполнять полнотекстовые запросы, что означает, что он не может возвращать предложения, основанные на словах в середине поля из нескольких слов.
Из самого ElasticSearch:
Причина в том, что FST-запрос отличается от полнотекстового запроса. Мы не можем найти слова нигде внутри фразы. Вместо этого мы должны начать слева от графика и двигаться вправо.
Как вы обнаружили, лучшей альтернативой для подсказки завершения, которая может соответствовать середине полей, является n-граммовый фильтр ребер.
Я знаю, что этому вопросу давно, но пробовали ли вы иметь несколько предложений, одно на основе префикса, а другое на основе регулярного выражения?
Что-то типа
{
"suggest": {
"test-suggest-exact" : {
"prefix" :"ela",
"completion" : {
"field" : "suggest",
"skip_duplicates": true
}
},
"test-suggest-regex" : {
"regex" :".*ela.*",
"completion" : {
"field" : "suggest",
"skip_duplicates": true
}
}
}
}
Используйте результаты второй подсказки, когда первая пуста. Хорошо то, что предложения Elasticsearch возвращают содержательные фразы.
Подход на основе Shingle, использующий полный поиск по запросу с последующим агрегированием по условиям поиска, иногда дает неверные фразы, которые контекстуально неверны. Я могу написать больше, если вам интересно.