Azure Search Highlight Частичное совпадение
Я включил Подсветку Хита, и она работает хорошо для целых совпадений слов. Но мы добавляем подстановочный знак в конце каждого слова, указанного пользователем, и выделение не работает с частичными совпадениями. Мы получаем результаты обратно, но объект.Highlights имеет значение null, поэтому для частичного сопоставления подсветка недоступна.
Вот как мы настраиваем параметры поиска:
var parameters = new SearchParameters
{
Filter = newFilter,
QueryType = QueryType.Full,
Top = recordsPerPage,
Skip = skip,
SearchMode = SearchMode.Any,
IncludeTotalResultCount = true,
HighlightFields = new List<string> { "RESULT" },
HighlightPreTag = "<font style=\"color:blue; background-color:yellow;\">",
HighlightPostTag = "</font>"
};
return parameters;
response = indexClient.Documents.Search<SearchResultReturn>(query, parameters);
Вот пример нашей строки запроса: ("the") the*^99.95
Идея в том, что мы ищем точную строку, указанную пользователем (несколько слов), а затем делаем поиск по шаблону для каждого указанного слова.
Таким образом, для приведенного выше примера мы получаем все результаты, которые содержат "the" и "*", но только слова "the" имеют выделение. "Они", "Там" и т. Д. Не имеют никакого выделения, даже если "Они" - единственная подходящая запись в результате ("the" не было в результате).
Опять же, запрос возвращает правильные результаты, просто выделение не работает для частичных совпадений.
Есть ли какие-то другие настройки, которые мне нужны, чтобы иметь возможность выделить частичные совпадения?
2 ответа
Спасибо за сообщение о проблеме.
К сожалению, в поиске Azure известно ограничение, которое иногда не выделяется для широкого поиска с использованием подстановочных знаков. Выделение - это самостоятельный процесс после поиска. Как только найдены соответствующие документы, маркер просматривает поисковый индекс для всех терминов, которые соответствуют критериям подстановочного знака, и использует эти термины при выделении найденных документов. Для широких поисковых запросов с подстановочными знаками, таких как * (или *), маркер использует только самые верхние N наиболее значимых терминов в зависимости от их частоты в корпусе по соображениям производительности. В вашем примере "они" и "там" не включены в основные моменты, вероятно, из-за их появления в большинстве документов.
Так как это ограничение в запросах с подстановочными знаками, одним из обходных путей является предварительная обработка индекса, чтобы избежать выдачи запросов с подстановочными знаками / префиксами. Пожалуйста, взгляните на пользовательский анализ ( https://docs.microsoft.com/en-us/rest/api/searchservice/custom-analyzers-in-azure-search). Вы можете, например, использовать toNenfilter для edgeNgram и хранить префиксы слов в индексе и сгенерируйте регулярный запрос с префиксом (без оператора '*')
Надеюсь это поможет. Пожалуйста, дайте мне знать, если у вас есть дополнительные вопросы.
Nate
Спасибо за ответ, но, похоже, это не проблема, похоже, это проблема с функцией Boosting, которую я использую при поиске.
Когда я убрал функцию повышения, то частичная подсветка работала, как и ожидалось. Когда я добавил функцию повышения обратно в частичную подсветку перестала работать. Можете ли вы проверить, что это ошибка?
Вот моя функция повышения:
"scoringProfiles":[{"name":"PreRiskBoost",
"text":null,"functions":
[{"fieldName":"PreRiskCount",
"freshness":null,
"interpolation":"linear",
"magnitude":{"boostingRangeStart":1,
"boostingRangeEnd":99,
"constantBoostBeyondRange":true},
"distance":null,
"tag":null,
"type":"magnitude","boost":10}],
"functionAggregation":"sum"}],
"defaultScoringProfile":"PreRiskBoost"
Знаете ли вы, почему функция Boosting предотвращает частичную подсветку?