ElasticSearch: как я могу повлиять на "направленность" совпадения триграмм? - PullRequest
0 голосов
/ 11 июля 2019

мы используем эластичный поиск для поиска по адресным данным, а для целей неточных совпадений мы включаем вариант поля названия улицы, который анализируется с помощью токенайзера ngram (триграммы будут уточнены).и мы используем условие минимального совпадения «3 <75%» для запросов в этом поле, что означает «если в поисковом запросе три или менее триграмм, то все они должны совпадать.Если их больше 3, то 75% из них должны соответствовать '</p>

, как правило, это работает нормально, но есть случаи, когда мы получаем непредвиденные результаты, подобные этому

Мы ищем "Uhland"и мы находим "Am Maschlandgraben".Насколько я могу судить, происходит то, что «Uhland» разбивается на «uhl», «hla», «lan», «and», и 3 из этих 4 триграмм можно сопоставить с триграммами «Am MascHLANDgraben» (совпадающая часть в верхнем регистре).Итак, 3 из 4 - это 75%, что соответствует нашему требованию «3 <75%», поэтому оно становится совпадением. </p>

Таким образом, существует «направленность» (из-за отсутствия лучшего слова) для этого 75% матч.он только просматривает / подсчитывает количество терминов в поисковом термине и игнорирует, сколько триграмм проиндексированного документа не соответствует.

Можно утверждать, что в этом примере требование соответствия 75% не выполняется,потому что 10 из 13 триграмм из "Am Maschlandgraben" не совпадают с триграммами "Uhland".И на самом деле, если вы измените запрос и выполните поиск «Am Maschlandgraben», вы не найдете «Uhland» как совпадение.Потому что теперь «направленность» перевернута, и запрос понимает, что сопоставлены только 3 из 13 триграмм и что не соответствует требованию «3 <75%» </p>

, что я хотел бы выяснить, какя могу изменить запрос так, чтобы совпадение на 75% не имело «направленности» и всегда должно совпадать на «обеих сторонах» сравнения.так что, чтобы остаться в примере выше, я не хочу, чтобы «Uhland» соответствовал «Am Maschlandgraben», а «Am Maschlandgraben» - «Uhland»язык, вместо «75% триграмм поисковых терминов должны совпадать с индексированным документом», я хотел бы иметь «75% триграмм поисковых терминов и индексированных документов должны совпадать»

надеюсь, я общался хорошодостаточно того, что я собираюсь сделать (английский не мой родной язык)

Вот пример того, как выглядит наш запрос прямо сейчас:

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "address.street.trigram": {
              "query": "Uhland",
              "minimum_should_match": "3<75%"
            }
          }
        }
      ]
    }
  }
}
...