Как профили оценки создают оценки в Поиске Azure?

Я хочу добавить профиль оценки в свой индекс в Поиске Azure. В частности, каждый документ в моем индексе имеет поле weight типа Edm.Double, и я хочу увеличить их в соответствии с этим значением. Я не хочу просто сортировать их по weight, потому что релевантность поискового запроса также важна.

Поэтому, чтобы проверить это, я создал профиль оценки с функцией величины со значением повышения 1000 (просто чтобы посмотреть, понял ли я, как это работает), линейной интерполяцией, начальным значением 0 и конечным значением 1. Я ожидал, что значение повышения, которое будет добавлено к общей оценке поиска. Таким образом, документ с весом 0,5 получит повышение на 500, тогда как документ с весом 0,125 получит повышение на 125. Однако итоговые оценки были далеко не такими интуитивно понятными.

У меня есть пара вопросов по этому поводу:

1) Как в этом случае формируется оценка функции? У меня есть документы с весами, близкими друг к другу (скажем, 0,5465 и 0,5419), но разница между их окончательными оценками составляет около 100-150, тогда как я ожидал, что это будет около 4-5.

2) Как оценки функций и веса суммируются в итоговую оценку для каждого результата поиска?


person halileohalilei    schedule 02.01.2017    source источник


Ответы (2)


Спасибо за подробности. Каковы были базовые оценки релевантности двух документов?

Фактор повышения, указанный в профиле оценки, на самом деле умножается на базовые оценки релевантности, вычисленные с использованием частотности терминов. Например, предположим, что базовые оценки, указанные в @ search.score в полезной нагрузке ответа, для двух документов равны 0,5 и 0,2, а значения в столбце веса - 0,5465 и 0,5419 соответственно. С конфигурацией профиля оценки, приведенной выше, с начальным значением 0, конечным значением 1, линейной интерполяцией и коэффициентом усиления 1000. Окончательная оценка, которую вы получаете для каждого документа, вычисляется следующим образом:

документ 1: базовое значение 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) - min (0)) / max - min (1) = final_search_score (108,38)

Пожалуйста, дайте мне знать, если полученные вами окончательные оценки не соответствуют описанной выше функции. Спасибо!

Нейт

person Nate Ko    schedule 04.01.2017
comment
Спасибо, Нейт, это прекрасно отвечает на мой вопрос. Одно уточнение, которое мне нужно, - это использование весов для каждого поля. Если у меня есть веса в моих полях, сначала рассчитывается базовая оценка с этими весами, а затем с использованием этой базовой оценки рассчитывается формулировка, которую вы объяснили, это правильно? - person halileohalilei; 04.01.2017
comment
Если вы имеете в виду веса полей в профиле оценки, да, вес поля уже учтен в базовой оценке, тогда применяется дополнительное усиление. - person Nate Ko; 04.01.2017
comment
Еще раз спасибо, Нейт. И последнее. Всегда ли документ с минимальным значением в функции оценки получает окончательную оценку 0? В моем случае weight - min может быть 0, однако в этом случае я не хочу, чтобы этот документ находился глубоко в результатах поиска, я просто не хочу, чтобы он повышался и сохранял исходную базовую оценку. Поэтому вместо того, чтобы умножать интерполированный коэффициент усиления на базовую оценку, я хочу их сложить. Есть ли способ сделать это? Или какое-то другое решение этой проблемы? - person halileohalilei; 04.01.2017
comment
@NateKo - Исходя из фона elasticsearch, пробую свои силы в поиске Azure. Я играл с функцией подсчета очков, но не получал очков в соответствии с приведенным выше уравнением. В моем случае у меня есть 0,71231794 как base_search_score, boost_factor = 2, weight (значение поля) = 3, min = 0 и max = 5. Таким образом, по приведенной выше функции новая оценка должна быть (0,71231794 × 2 × (3−0)) ÷ 5 = 0,854781528. Но окончательная оценка, которую я получил в ответ, - 1.1397088. Я что-то упустил или уравнение изменилось в последней версии? - person Bhavesh; 09.05.2019

Таким образом, ответ Нейта трудно понять, и в нем отсутствуют некоторые компоненты. Я сделал обзор всего процесса подсчета очков, и он довольно сложен.

Поэтому, когда пользователь выполняет поиск, поиску 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
comment
Последняя строка здесь сбивает с толку Правило состоит в том, чтобы умножить общую оценку функций профиля оценки на общую взвешенную оценку полей, что дает нам общую сумму: 15.03 + 1.5 = 16.53. Это умножение или сложение с взвешенной базовой оценкой? - person Pankaj Yadav; 28.07.2021
comment
Пожалуйста, прочтите это подробное сообщение в блоге. Сумма взвешенной оценки умножается на оценку агрегированных функций. dibranmulder.github.io/2020/09/22 / - person Dibran; 28.07.2021