Проблема с запросом match_phrase_prefix для эластичного поиска

У меня проблема с запросом с использованием match_phrase_prefix. P.ex допустим, у меня есть запись с display_name = "переполнение стека". Если я запрашиваю, используя «стек» или «стек», он найдет запись, но не если я попробую «стек o». Я заметил, что об этом спрашивали раньше, и проблема связана с префиксом, но, похоже, я не нашел правильного ответа. Какие-нибудь мысли?


person fidans    schedule 18.03.2020    source источник
comment
match_phrase_prefix должен возвращать документ со стеком o. Можете ли вы добавить свой полный запрос и сопоставление   -  person jaspreet chahal    schedule 18.03.2020
comment
@jaspreetchahal К сожалению, мне не разрешено делиться исходным кодом. Лучшее, что я могу сделать, это поделиться этим: i.imgur.com/pmfI89V.png   -  person fidans    schedule 19.03.2020


Ответы (1)


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

Отображение индекса

{
  "mappings": {
    "properties": {
      "display_name": {
        "type": "text"
      }
    }
  }
}

Указательный документ

{
   "display_name" : "stack overflow"
}

Поисковый запрос

{
    "query": {
        "match_phrase_prefix" : {
            "display_name" : {
                "query" : "stack o"
            }
        }
    }
}

И он возвращает проиндексированный выше документ

"hits": [
         {
            "_index": "so-60620921-match-prefix",
            "_type": "_doc",
            "_id": "1",
            "_score": 0.5753642,
            "_source": {
               "display_name": "stack overflow"
            }
         }
      ]

Вы даже можете проверить пример официального документа ES, где он возвращает документ для quick brown f.

person user156327    schedule 18.03.2020
comment
Помимо значения (в данном случае stack o), которое мне нужно преобразовать в нижний регистр, остальная часть кода в основном похожа, если не идентична. Проблема возникает только тогда, когда я пытаюсь ввести слово, за которым следует пробел, а затем одна буква (стек o, abc d и т. д.). Он отлично работает, когда добавляются другие буквы. Есть ли общий случай, когда это может произойти? потому что это кажется очень странной проблемой. - person fidans; 19.03.2020
comment
@fidans, извините, я вас не понял, это работает для stack o, которое представляет собой слово, за которым следует пробел, а затем одна буква - person user156327; 19.03.2020
comment
Приношу извинения за неудобства, но мне не разрешено делиться исходным кодом. Лучшее, что я могу сделать, это визуализировать два примера: 1: i.imgur.com/pmfI89V.png 2: i.imgur.com/yrA37re.png Полное отображаемое имя — «ali mokaj». . Первый случай не работает, а второй и любой другой работает. - person fidans; 19.03.2020
comment
@fidans, нам не нужен ваш исходный код для отладки проблемы, можете ли вы просто удалить еще один запрос термина для id, а также опубликовать документ, содержащий ali mokaj? также ищите ответ в обоих случаях, как я указал в своем ответе - person user156327; 19.03.2020
comment
Документ зависит от этого идентификатора. Однако представляется, что проблема не является полностью последовательной. 1: i.imgur.com/wu7MoLp.png 2: i.imgur.com/Qn02SQn.png Первый случай аналогичен предыдущему примеру, поиск с помощью 'freskim a' не будет работа при поиске с 'freskim al' дала первый ответ (первая ссылка). Однако второй случай дал ответ, запросив «отобразить n» (вторая ссылка). - person fidans; 19.03.2020
comment
@fidans, спасибо, что следите за этим, но это выглядит странно, и важно знать ваше сопоставление индексов, не могли бы вы также поделиться этим, особенно с анализатором, примененным к вашему display_search_field - person user156327; 19.03.2020
comment
@fidans, я пробовал со своим сопоставлением (приведенным в ответе) и тестировал как freskim aliu, так и display nejmgg, и оба возвращают результат только с одним символом в конце. - person user156327; 19.03.2020
comment
@fidans, я только что еще раз посмотрел на ваши образцы, и вы делаете очень простые ошибки и смешиваете несколько вещей. - person user156327; 19.03.2020
comment
@fidans, пожалуйста, используйте сопоставление, предоставленное мной для ваших display_search_field, и переиндексируйте свои данные и сделайте правильный запрос, помните, что первый термин в вашем поисковом запросе должен быть полным, и только в последнем термине будет создан префиксный запрос. - person user156327; 19.03.2020
comment
@fidans, вы все еще сталкиваетесь с проблемой? - person user156327; 20.03.2020
comment
Извините за задержку ответа. У меня нет доступа к кибане, чтобы увидеть отображение индекса, но я свяжусь с DevOps. Кроме того, я не писал ни одного из запросов для этого, и мои знания об es очень ограничены, можете ли вы сказать мне, какие основные ошибки я сделал или микширование? - person fidans; 20.03.2020
comment
@fidans, спасибо за ответ, вы можете просто нажать https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-get-mapping.html GET, чтобы увидеть подробности сопоставления. Также вы можете создать свой собственный индекс elasticsearch локально и использовать мое сопоставление и ваши образцы данных (заставьте нас использовать небольшие данные, чтобы меньше шансов смешивания) и протестировать его самостоятельно. - person user156327; 21.03.2020
comment
Давайте продолжим это обсуждение в чате. - person user156327; 21.03.2020