Таким образом, ответ Нейта трудно понять, и в нем отсутствуют некоторые компоненты. Я сделал обзор всего процесса подсчета очков, и он довольно сложен.
Поэтому, когда пользователь выполняет поиск, поиску Azure присваивается query
. Поиск 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
.
Надеюсь, вам понравился этот пример.
person
Dibran
schedule
11.06.2020