Есть ли причина, по которой поиск azure не возвращает все возможные значения во время нечеткого поиска? - PullRequest
0 голосов
/ 07 февраля 2020

Моя проблема в том, что когда мы выполняем поиск по имени, используя нечеткий поиск (с интервалом в 2 символа в имени), это не возвращает все возможности.

QueryType is Full

QueryString - "FirstName: gra ~ 2 AND (LastName: \" ***** \ "ИЛИ LastName: /.*\"*****\".*/)"

Я использую точное совпадение ИЛИ a содержит фамилию для этого примера, она будет оставаться постоянной во всех примерах

Результаты :

Если я ищу FirstName: gre ~ 2 в Azure строке поискового запроса, которую мы получаем:

Greg
Gary
Gene

Если я ищу FirstName: gra ~ 2, мы возвращаемся:

Джина
Гари

Если я найду FirstName: grag ~ 2, мы вернемся:

Грег
Гари

Мы знаем, что azure Нечеткий поиск использует расстояние Дамерау-Левенштейна, и кажется, что от «gra» и «gina», и «greg» будет разница в 2 символа, но отображается только один. Кроме того, «grag» в теории должен возвращать и «gina»

Мне интересно, есть ли у кого-нибудь объяснение этому, поскольку оно кажется непоследовательным

Я использовал это для проверки " расстояние "между строками" gra "и" greg "&" gina "

http://fuzzy-string.com/Compare/

Вот ссылка на azure документация по синтаксису Lucene

https://docs.microsoft.com/en-us/azure/search/query-lucene-syntax

Это оба определения полей

{
  "name": "FirstName",
  "type": "Edm.String",
  "searchable": true,
  "filterable": true,
  "retrievable": true,
  "sortable": true,
  "facetable": false,
  "key": false,
  "indexAnalyzer": null,
  "searchAnalyzer": null,
  "analyzer": "standard.lucene",
  "synonymMaps": []
},

{
  "name": "LastName",
  "type": "Edm.String",
  "searchable": true,
  "filterable": true,
  "retrievable": true,
  "sortable": true,
  "facetable": false,
  "key": false,
  "indexAnalyzer": null,
  "searchAnalyzer": null,
  "analyzer": "standard.lucene",
  "synonymMaps": []
}

** Результаты кажутся быть одинаковым независимо от используемой фамилии или нет

1 Ответ

0 голосов
/ 07 февраля 2020

Я бы также ожидал, что эти термины будут соответствовать вашему нечеткому запросу. Просто чтобы проверить работоспособность, прежде чем мы углубимся, можете ли вы подтвердить свои настройки анализатора (как во время запроса, так и во время индексации)? Я просто хочу подтвердить, что все упомянутые вами термины фактически токенизированы и проиндексированы именно так, как вы ожидаете их (а также, если их регистр нормализуется так, как вы ожидаете их). Вы можете использовать API анализа (https://docs.microsoft.com/en-us/rest/api/searchservice/test-analyzer), чтобы подтвердить, как эти термины маркируются. Вы также упомянули, что ваш запрос включает в себя предложение AND, соответствующее другому полю (LastName). Можете ли вы подтвердить, что даже без этого второго предложения результаты по FirstName все еще не соответствуют вашим ожиданиям? Я просто хочу убедиться, что мы устраняем все внешние факторы за пределами алгоритма фактического расстояния редактирования.

Обновление: я попробовал его на моей стороне, используя анализаторы по умолчанию и без предложения LastName. при поиске "gra ~ 2" успешно возвращаются "Greg", "Gary" и "Gina". Я получаю те же результаты, когда я ищу "gre ~ 2" (как вы сделали). Поиск «grag ~ 2» возвращает только «Greg» и «Gary». «Джина» не возвращается, но мне кажется, что это ожидаемое (расстояние редактирования кажется 3).

...