Как профили скоринга генерируют оценки в поиске Azure?
Я хочу добавить профиль оценки в свой индекс в Azure Search. Более конкретно, каждый документ в моем индексе имеет weight
поле типа Edm.Double
и я хочу повысить их в соответствии с этим значением. Я не хочу просто напрямую сортировать их по weight
потому что актуальность поискового термина также важна.
Итак, просто чтобы проверить это, я создал профиль оценки с функцией величины со значением повышения 1000 (просто чтобы увидеть, понял ли я, как работает эта вещь), линейной интерполяцией, начальным значением 0 и конечным значением 1. Я ожидал, что увеличить значение, которое будет добавлено к общему количеству результатов поиска. Таким образом, документ с весом 0,5 получит повышение в 500, в то время как документ с весом 0,125 получит повышение в 125. Однако итоговые результаты были далеко не такими интуитивными.
У меня есть пара вопросов в этом случае:
1) Как оценка функции генерируется в этом случае? У меня есть документы с весами, близкими друг к другу (скажем, 0,5465 и 0,5419), но разница между их окончательными оценками составляет около 100-150, тогда как я ожидаю, что они будут около 4-5.
2) Как функциональные оценки и веса объединяются в итоговую оценку для каждого результата поиска?
1 ответ
Спасибо за предоставление деталей. Каковы были базовые оценки релевантности двух документов?
Коэффициент усиления, предоставленный в профиле оценки, фактически умножается на базовые оценки релевантности, вычисленные с использованием терминов частоты. Например, предположим, что базовые оценки, указанные в @ search.score в полезной нагрузке ответа, двух документов были 0,5 и 0,2, а значения в столбце веса были 0,5465 и 0,5419 соответственно. С приведенной выше конфигурацией профиля оценки, с начальным значением 0, конечным значением 1, линейной интерполяцией и коэффициентом усиления 1000. Окончательный результат, который вы получаете для каждого документа, рассчитывается следующим образом:
документ 1: base search_score(0.5) * boost_factor (1000) * (вес (0.5465) - min(0)) / max - min (1) = final_search_score(273.25)
документ 2: base_search_score(0.2) * boost_factor (1000) * (вес (0.5419) - мин (0)) / макс - мин (1) = final_search_score(108.38)
Пожалуйста, дайте мне знать, если итоговые результаты, которые вы получите, не соответствуют вышеуказанной функции. Спасибо!
Nate
Таким образом, ответ Нейта трудно понять, и в нем отсутствуют некоторые компоненты. Я сделал обзор всего процесса подсчета очков, и он довольно сложен.
Поэтому, когда пользователь выполняет поиск, query
предоставляется Поиску Azure. Поиск в Azure используетTF-IDF
алгоритм определения счета от 0 до 1 на основе Tokens
формируется Анализатором. Имейте в виду, что языковые анализаторы могут выдавать несколько лексем для одного слова. Для каждого доступного для поиска поля будет произведена оценка, а затемmultiplied
по весу в профиле подсчета очков. Наконец, все взвешенные оценки будут суммированы, и это будет исходная взвешенная оценка.
Профиль оценки может также содержать функции оценки. Функция оценки может быть функцией на основе величины, свежести, географии или тегов. В одном профиле подсчета очков можно выполнять несколько функций.
Функции будут оценены, и оценка функций может быть либо суммирована, либо взята средняя, минимальная, максимальная или первое сопоставление. Сумма всех функций затем умножается на общую взвешенную оценку, и это окончательная оценка.
Пример, это пример индекса с профилем оценки.
{
"name": "musicstoreindex",
"fields": [
{ "name": "key", "type": "Edm.String", "key": true },
{ "name": "albumTitle", "type": "Edm.String" },
{ "name": "genre", "type": "Edm.String" },
{ "name": "genreDescription", "type": "Edm.String", "filterable": false },
{ "name": "artistName", "type": "Edm.String" },
{ "name": "rating", "type": "Edm.Int32" },
{ "name": "price", "type": "Edm.Double", "filterable": false },
{ "name": "lastUpdated", "type": "Edm.DateTimeOffset" }
],
"scoringProfiles": [
{
"name": "boostGenre",
"text": {
"weights": {
"albumTitle": 1.5,
"genre": 5,
"artistName": 2
}
}
},
{
"name": "newAndHighlyRated",
"functions": [
{
"type": "freshness",
"fieldName": "lastUpdated",
"boost": 10,
"interpolation": "linear",
"freshness": {
"boostingDuration": "P365D"
}
},
{
"type": "magnitude",
"fieldName": "rating",
"boost": 8,
"interpolation": "linear",
"magnitude": {
"boostingRangeStart": 1,
"boostingRangeEnd": 5,
"constantBoostBeyondRange": false
}
}
],
"functionAggregation": 0
}
]
}
Допустим, введенный запрос meteora
знаменитый альбом Linkin Park. Допустим, у нас есть следующий документ в нашем index.
{
"key": 123,
"albumTitle": "Meteora",
"genre": "Rock",
"genreDescription": "Rock with a flick of hiphop",
"artistName": "Linkin Park",
"rating": 4,
"price": 30,
"lastUpdated": "2020-01-01"
}
Я не эксперт по TF-IDF, но могу представить, что будет получена следующая невзвешенная оценка:
{
"albumTitle": 1,
"genre": 0,
"genreDescription": 0,
"artistName": 0
}
Профиль подсчета очков имеет вес 1,5 в поле albumTitle, поэтому общая взвешенная оценка будет: 1 * 1.5 + 0 + 0 + 0 = 1.5
После этого будут оценены функции профиля скоринга. В данном случае их 2. Первый оценивает свежесть в диапазоне 365 дней, один год. Последнее обновленное поле имеет значение 1 апреля этого года. Допустим, это через 50 дней. Общий диапазон составляет 365, поэтому вы получите 1 балл, если дата последнего обновления - сегодня. И 0, если это 365 дней или больше в прошлом. В нашем случае это1 - 50 / 365 = 0.8630..
. Повышение функции10
поэтому оценка для первой функции 8.630
.
Вторая функция - это функция величины с диапазоном от 1 до 5. Документ получил оценку 4 звезды, так что это дает оценку 0,8, потому что 1 звезда - это 0, а 5 звезд - 1. Таким образом, для 4 звезд, очевидно, 4 / 5 = 0.8
. Увеличение функции величины составляет 8, поэтому мы должны умножить значение на 8.0.8 * 8 = 6.4
.
В functionAggregation
равно 0, что означает, что мы должны суммировать результаты всех функций. Это дает нам общую оценку функций профиля оценки:6.4 + 8.630 = 15.03
. Правило состоит в том, чтобы умножить общую оценку функций профиля оценки на общую взвешенную оценку полей, что дает нам общую сумму:15.03 + 1.5 = 16.53
.
Надеюсь, вам понравился этот пример.