Полный поиск Azure с использованием подстановочного или нечеткого поиска не дает ожидаемого результата - PullRequest
0 голосов
/ 17 июня 2019

У меня есть следующие записи в моем поисковом индексе Azure

{ 
    "customerId": "8feda7ca-c9f0-40d9-86d8-434b0bbe94c2", 
    "registeredName": "TeamPeacock", 
    "tradingName": "TeamPeacock", 
}, 
{ 
    "customerId": "b445eb04-8d07-4708-a197-770cda3a459e", 
    "registeredName": "TeamPeacock1", 
    "tradingName": "TeamPeacock 1", 
}

Я использую полный поиск с подстановочным / нечетким поиском для извлечения записей.

Ниже по поисковым запросам не удается получить вышеуказанные записи:

Сбой запроса 1:

{ 
    "search": "(peacock*) OR (peacock*~) OR (peacock~)", 
    "queryType": "full", 
    "searchMode": "all" 
}

Сбой запроса 2:

{ 
    "search": "(peacock*) OR (peacock*~) OR (peacock~)", 
    "queryType": "full", 
    "searchMode": "any" 
}

Сбой запроса 3:

{ 
    "search": "(peacock*)", 
    "queryType": "full", 
    "searchMode": "any" 
}

Сбой запроса 4:

{ 
    "search": "(peacock*~) OR (peacock~)", 
    "queryType": "full", 
    "searchMode": "any" 
}

Но если я включу термин "teampeacock", поисковый запрос вернет результат.

Пропущенный запрос:

{ 
    "search": "(teampeacock*) OR (peacock*~) OR (peacock~)", 
    "queryType": "full", 
    "searchMode": "all" 
}

Пропущенный запрос:

{ 
    "search": "(teampeacock*~) OR (peacock~)", 
    "queryType": "full", 
    "searchMode": "any" 
}

Почему поиск с термином "павлин" не возвращает данные?

1 Ответ

2 голосов
/ 17 июня 2019

Вы можете использовать API анализа, чтобы понять, как Azure Search создает токены из вашего текста: https://docs.microsoft.com/en-us/rest/api/searchservice/test-analyzer

В вашем случае ожидается, что поиск "peacock *" не будет соответствовать документуон содержит только термин «teampeacock», так как между термином «команда» и «павлин» нет разделителей.Это означает, что в вашем индексе будет создан только 1 токен («teampeacock»).Так как вы использовали подстановочный знак в конце «peacock» в своем поисковом запросе («peacock *»), то токены, начинающиеся с «peacock», будут совпадать, а токены, начинающиеся с «teampeacock» - нет.

Если вы хотите сопоставить что-либо, содержащее «павлин», вы можете использовать его как «инфикс», а не «префикс» со следующим запросом:

{ 
    "search": "/.*peacock.*/", 
    "queryType": "full",
    "searchMode":"all"
}

edit: просто добавитьв качестве предупреждения, если производительность вызывает обеспокоенность, вы должны знать, что использование подстановочных знаков таким образом неэффективно, поскольку в конечном итоге вы пройдете большую часть индекса, чтобы найти подходящие термины.Более эффективным способом поиска по префиксам и суффиксам было бы использование токенайзера edgeNGram во время индексации для создания различных токенов, которые представляют начало или конец ваших слов.Для более подробной информации, вы можете посмотреть документацию по заказному анализатору: https://docs.microsoft.com/en-us/azure/search/index-add-custom-analyzers

...