Как профили скоринга генерируют оценки в поиске 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.

Надеюсь, вам понравился этот пример.

Другие вопросы по тегам