Elasticsearch: подсказчик завершения не работает с анализатором пробелов

Я новичок в эластичном поиске и пытаюсь создать одну демонстрацию подсказки завершения с помощью анализатора пробелов.

Согласно документации анализатора пробелов , Он разбивает текст на термины всякий раз, когда встречает пробельный символ. Итак, мой вопрос: работает ли это и с суггестером завершения?

Итак, для моего префикса подсказки завершения: "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 использовать для этого подсказчика завершения?

Я считаю эту ссылку полезной Подсказка завершения, ориентированного на слова (ElasticSearch 5. х). Однако они не использовали подсказку завершения.

Заранее спасибо.

Джимми


person Jimmy    schedule 17.01.2018    source источник
comment
У меня точно такая же проблема с пользовательским анализатором, кажется, что завершение как-то не учитывает вывод анализатора   -  person pcambra    schedule 02.03.2018
comment
да, что-то не так с анализатором в доработке суггестера. Наконец, я использую альтернативное решение для добавления нескольких тегов во входной массив вместо ожидаемого подхода.   -  person Jimmy    schedule 03.03.2018
comment
Вместо этого я исследую nGrams.   -  person pcambra    schedule 04.03.2018
comment
@pcambra, ладно. Я пробовал описанный выше подход с помощью edge-ngrams, и он работал правильно. вы можете попробовать эту ссылку stackoverflow. com / questions / 41744712 ​​/ Я выполнил процедуру, указанную в принятом ответе, и она хорошо справилась с моим требованием. Единственное, что мы не можем пропустить дубликат с ngram.   -  person Jimmy    schedule 05.03.2018


Ответы (2)


Подсказка завершения не может выполнять полнотекстовые запросы, что означает, что он не может возвращать предложения, основанные на словах в середине поля, состоящего из нескольких слов.

Из самого ElasticSearch:

Причина в том, что запрос FST отличается от полнотекстового запроса. Мы не можем найти слов во фразе. Вместо этого мы должны начать с левой части графика и двигаться вправо.

Как вы обнаружили, лучшей альтернативой подсказке завершения, которая может соответствовать середине поля, является фильтр граничных n-грамм.

person Simon Tower    schedule 07.01.2019

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

Что-то вроде

{
    "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, использующий полный поиск по запросу с последующим агрегированием на основе поисковых запросов, иногда дает неработающие фразы, которые контекстуально неверны. Я могу написать еще, если вам интересно.

person karthikcru    schedule 19.05.2020