Проблема релевантности результатов поиска Elasticsearch - PullRequest
1 голос
/ 09 апреля 2019

Может кто-нибудь объяснить мне, пожалуйста, почему запрос соответствия сначала возвращает менее релевантные результаты? У меня есть индексное поле с именем «нормализовано». Его отображение:

normalized: {
    type: "text"
    analyzer: "autocomplete"
}

настройки для этого поля:

analysis; {
    filter: {
        autocomplete_filter: {
            type: "edge_ngram",
            min_gram => "1",
            max_gram => "20"
        }
    analyzer: {
        autocomplete: {
            filter: [
                "lowercase",
                "asciifolding",
                "autocomplete_filter"
            ],
            type: "custom",
            tokenizer: "standard"
        }
    }

так как я знаю, что это делает токены ascii, строчные, например МЫШЬ = m, mo, mou, mous, mouse. Проблема в том, что запрос вроде:

{
    'query': {
        'bool': {
            'must': {
                'match': {
                    'normalized': 'simag'
                }
             }
         }
     }
 }

возвращает результаты типа

  1. "Симан Симан Сервис"
  2. "мгр симона симункова симики"
  3. "Симан - СИМАНС"
  4. "Симунек Симунек Симунек"
  5. .....

Но нет SIMAG , который содержит все буквы фразы соответствия. Как достичь этого наиболее релевантного результата будут слова, которые содержат все буквы перед токенами, которые не содержат все буквы. Надеюсь, кто-нибудь поймет, что мне нужно. Спасибо.

PS: я не уверен, но как насчет этого запроса:

{
    'query': {
        'bool': {
            'should': [
                {'term': {'normalized': 'simag'}},
                {'match': {'normalized': 'simag'}}
             ]
         }
     }
 }

Имеет ли это смысл по сравнению с предыдущим кодом?

1 Ответ

2 голосов
/ 10 апреля 2019

Обратите внимание, что запрос на совпадение анализируется, что означает, что во время запроса использовался тот же анализатор, который использовался во время индексации для поля, которое вы указали в запросе.

В вашем случае вы применили анализатор autocomplete к своему полю normalized и, как вы упомянули, он генерирует токен ниже для MOUSE:

MOUSE = m, mo, mou, mous, mouse.

Аналогичным образом, если вы ищете mouse, используя запрос match в том же поле, он будет искать строки запроса ниже: -

m, mo, mou, mous, mouse .. следовательно, результаты, содержащие такие слова, как mousee или mouser, также будут поступать так же, как и во время индекса ... он создал токены, которые совпадают с токенами, сгенерированными для поискового запроса.

Подробнее о запросе соответствия на сайте Elastic https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html первая строка сама объясняет результаты вашего поиска

запросы на совпадение принимают текст / цифры / даты, анализируют их и строит запрос:

Если вы хотите углубиться и понять, как ваш поисковый запрос соответствует документам и его оценке, используйте explain API

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-explain.html

Дайте мне знать, если у вас есть какие-либо вопросы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...