新增評分設定檔以提高搜尋分數

在本文中,您將會了解如何定義評分設定檔。 評分設定檔是根據您提供的參數來提高搜尋分數的準則。 例如,您可能想要在 [標籤] 欄位中找到的相符項目比在 [描述] 中找到的同一相符項目更有相關性。 此準則可以是加權欄位 (例如「標籤」範例) 或函式。

評分設定檔是在搜尋索引中定義,並在查詢要求中的非向量欄位上叫用。 您可以建立多個設定檔,然後修改查詢邏輯以選擇要使用哪一個設定檔。

注意

不熟悉相關性概念嗎? 下列 YouTube 影片片段快轉到說明評分設定檔在 Azure AI 搜尋服務運作方式的部分。 您也可以造訪 Azure AI 搜尋服務中的相關性和評分,以取得更多背景資訊。

評分設定檔定義

評分設定檔是在索引結構描述中定義的具名物件。 設定檔可以由加權欄位、函式和參數組成。

下列定義顯示名為 "geo" 的簡單設定檔。 此範例會提升 hotelName 欄位中有搜尋字詞的結果。 也會使用 distance 函式,優先列出與目前位置相距 10 公里以內的結果。 如果有人搜尋 'inn' 一詞,而 'inn' 剛好是飯店名稱的一部分,則文件中只要包含具有 'inn'、且位於目前所在位置半徑 10 公里範圍內的飯店,就會出現在搜尋結果中的較高位置。

"scoringProfiles": [
  {  
    "name":"geo",
    "text": {  
      "weights": {  
        "hotelName": 5
      }                              
    },
    "functions": [
      {  
        "type": "distance",
        "boost": 5,
        "fieldName": "location",
        "interpolation": "logarithmic",
        "distance": {
          "referencePointParameter": "currentLocation",
          "boostingDistance": 10
        }                        
      }                                      
    ]                     
  }            
]

若要使用此評分設定檔,系統會編寫您的查詢,以在要求中指定 scoringProfile 參數。 如果您使用 REST API,則會透過 GET 和 POST 要求來指定查詢。 在下列範例中,"currentLocation" 具有單一破折號的分隔符號 (-)。 其後面接著經度和緯度座標,其中經度是負值。

GET /indexes/hotels/docs?search+inn&scoringProfile=geo&scoringParameter=currentLocation--122.123,44.77233&api-version=2020-06-30

請注意使用 POST 時的語法差異。 在 POST 中,「scoringParameters」是複數且為陣列。

POST /indexes/hotels/docs&api-version=2020-06-30
{
    "search": "inn",
    "scoringProfile": "geo",
    "scoringParameters": ["currentLocation--122.123,44.77233"]
}

此查詢會搜尋「inn」一詞,並傳入目前的位置。 請注意這個查詢包括其他參數,例如 scoringParameter。 如需包括「scoringParameter」在內的查詢參數說明,請參閱搜尋文件 (REST API)

請參閱延伸範例,檢閱更詳細的評分設定檔範例。

如何計算分數

分數是針對全文檢索搜尋查詢計算的。 相符項目會根據相符項目的相關程度進行評分,並在查詢回應中傳回最高評分的相符項目。 每個文件的整體分數是每個欄位的個別分數彙總,其中每個欄位的個別分數是根據該欄位中搜尋字詞出現的字詞頻率和文件頻率來計算 (稱為 TF-IDF 或字詞頻率-反向文件頻率)。

您可以使用 featuresMode (預覽版) 參數,透過搜尋結果要求額外的評分詳細資料 (包括欄位層級分數)。

新增評分邏輯的時機

當預設排名行為不足以因應您的商業目標時,您應建立一或多個評分設定檔。 例如,您可以決定讓新增的項目具有較高的搜尋相關性。 同樣地,您可以讓某個欄位包含毛利率,或讓其他欄位指出潛在營收。 能有效提升對使用者或業務更有意義的結果,通常是採用評分設定檔的決定因素。

此外也會透過評分設定檔實作搜尋頁面中以相關性為基礎的排序。 請考量您過去曾經使用、讓您依價格、日期、評等或相關性排序的搜尋結果頁面。 在 Azure AI 搜尋服務中,評分設定檔可以用來驅動 [相關性] 選項。 相關性的定義由使用者決定,取決於業務目標和您要提供的搜尋體驗類型。

新增評分設定檔的步驟

若要實作自訂的計分行為,請將評分設定檔新增至定義索引的結構描述。 一個索引內最多可以有 100 個評分設定檔 (請參閱服務限制),但在任何特定查詢中,一次只能指定一個設定檔。

  1. 從索引定義開始。 您可以在現有的索引上新增和更新評分設定檔,而不需要重建。 使用更新索引要求發佈您的修訂。

  2. 在本文提供的範本中貼上。

  3. 提供名稱。 評分設定檔是選用的,但如果您新增了設定檔,就必須提供名稱。 欄位務必遵循 Azure AI 搜尋服務的命名慣例 (以字母開頭,避免使用特殊字元和保留字)。

  4. 指定提升條件。 單一設定檔可以包含加權欄位函式或兩者。

您應該反覆運作,使用資料集協助您證明或反駁設定檔的效力。

評分設定檔可以在 Azure 入口網站中定義,如下列螢幕擷取畫面所示,或是透過 REST API 或在 Azure SDK 中以程式設計方式定義,例如 Azure SDK for .NET 中的 ScoringProfile 類別。

Add scoring profiles page

使用加權欄位

當欄位內容很重要且查詢是全文檢索搜尋時,請使用加權欄位。 例如,如果查詢包含「airport」一詞,您可能希望「airport」在 [描述] 欄位中比在 HotelName 中的權數還多。

加權欄位是由可搜尋的欄位與做為乘數的正數組成。 如果 HotelName 的原始欄位分數為 3,該欄位的提升分數會變成 6,因而讓父文件本身的整體分數提高。

"scoringProfiles": [  
    {  
      "name": "boostKeywords",  
      "text": {  
        "weights": {  
          "HotelName": 2,  
          "Description": 5 
        }  
      }  
    }
]

使用函式

當簡單相對權數不足或不適用時,請使用函式,如同距離和時效性的情況,需對數值資料進行計算。 您可以為每個評分設定檔指定多個函式。 如需 Azure AI 搜尋服務中所用 EDM 資料類型的詳細資訊,請參閱支援的資料類型

函式 描述
"freshness" 依日期時間欄位 (Edm.DateTimeOffset) 中的值提升。 此函式具有「boostingDuration」屬性,因此您可以指定值,代表發生提升的時間範圍。
"magnitude" 根據數值的高低提升。 呼叫此函數的案例,包含依毛利率、最高價格、最低價格或下載次數進行提升。 此函數僅適用於 Edm.DoubleEdm.Int 欄位。 使用 magnitude 函式時,若您想要反轉模式 (例如將價格低的項目提升為高於價格高的項目),可將高至低的範圍反轉。 假設價格範圍為 100 到 1 美元,會將「boostingRangeStart」設為 100,並將「boostingRangeEnd」設為 1,以提升價格較低的項目。
"distance" 依鄰近性或地理位置提升。 此函數僅適用於 Edm.GeographyPoint 欄位。
"tag" 依搜尋文件和查詢字串共通的標記提升。 標記是在「tagsParameter」中提供。 此函式只能與 Edm.StringCollection(Edm.String) 類型的搜尋欄位搭配使用。

使用函數的規則

  • 函式只能套用至屬性為可篩選的欄位。
  • 函式類型 ("freshness"、"magnitude"、"distance"、"tag") 必須是小寫。
  • 函式不可包含 null 或空值。

範本

本節說明評分設定檔的語法與範本。 如需評分設定檔屬性的說明,請參考下一節的屬性參考

"scoringProfiles": [  
  {   
    "name": "name of scoring profile",   
    "text": (optional, only applies to searchable fields) {   
      "weights": {   
        "searchable_field_name": relative_weight_value (positive #'s),   
        ...   
      }   
    },   
    "functions": (optional) [  
      {   
        "type": "magnitude | freshness | distance | tag",   
        "boost": # (positive number used as multiplier for raw score != 1),   
        "fieldName": "(...)",   
        "interpolation": "constant | linear (default) | quadratic | logarithmic",   

        "magnitude": {
          "boostingRangeStart": #,   
          "boostingRangeEnd": #,   
          "constantBoostBeyondRange": true | false (default)
        }  

        // ( - or -)  

        "freshness": {
          "boostingDuration": "..." (value representing timespan over which boosting occurs)   
        }  

        // ( - or -)  

        "distance": {
          "referencePointParameter": "...", (parameter to be passed in queries to use as reference location)   
          "boostingDistance": # (the distance in kilometers from the reference location where the boosting range ends)   
        }   

        // ( - or -)  

        "tag": {
          "tagsParameter":  "..."(parameter to be passed in queries to specify a list of tags to compare against target field)   
        }
      }
    ],   
    "functionAggregation": (optional, applies only when functions are specified) "sum (default) | average | minimum | maximum | firstMatching"   
  }   
],   
"defaultScoringProfile": (optional) "...", 

屬性參考

屬性 描述
NAME 必要。 這是評分設定檔的名稱。 它會遵循欄位的相同命名慣例。 必須以字母開頭,且不可包含點、冒號或 @ 符號,而且開頭不可以是片語 azureSearch (區分大小寫)。
text 包含權數屬性。
weights 選擇性。 指定可搜尋欄位的成對名稱和數值,以及可用來提升欄位分數的正整數或浮點數。 正整數或數字會成為排名演算法所產生原始欄位分數的乘數。 例如,如果欄位分數為 2 而權數值為 3,欄位的提升分數會變成 6。 接著系統會彙總個別欄位分數以建立文件欄位分數,然後用來排名結果集中的文件。
functions 選擇性。 評分函式只能套用至可篩選的欄位。
functions > type 計分函數的必要項目。 指出要使用的函數類型。 有效值包括量級、有效性、距離和標記。 您可以在每個評分設定檔中包含多個函數。 函數名稱必須是小寫。
functions > boost 計分函數的必要項目。 做為原始分數之乘數的正數。 不能等於 1。
functions > fieldname 計分函數的必要項目。 計分函數只能套用至屬於索引的欄位集合、並且可篩選的欄位。 此外,每個函式類型都有額外的限制 (有效性與日期時間欄位搭配使用,量級與整數或雙精確度浮點數欄位搭配,距離與位置欄位搭配)。 每個函數定義只能指定一個欄位。 例如,若要在相同的設定檔中使用量級兩次,您必須包含兩個定義量級,每個欄位各一個。
functions > interpolation 計分函數的必要項目。 定義從範圍開始到範圍結束提升分數的增加斜率。 有效值包括線性 (預設值)、常數、二次方程式和對數。 如需詳細資訊,請參閱 設定內插補點
functions > magnitude 量級計分函數可用來根據數值欄位的值範圍改變排名。 其中幾個最常見的使用範例包括:

「星級評等:」根據 [星級評等] 欄位中的值來改變評分。 當兩個項目相關時,會先顯示具有更高評等的項目。
「利潤:」當兩份文件相關時,零售商可能希望先提升利潤較高的文件。
「點擊數:」如果應用程式會追蹤對產品或頁面的點擊動作,您可以使用 magnitude 來提升可能獲得最多流量的項目。
「下載次數:」如果應用程式會追蹤下載情形,magnitude 函式可讓您提升下載次數最多的項目。
functions > magnitude > boostingRangeStart 設定計算量級分數之範圍的起始值。 此值必須是整數或浮點數。 就 1 到 4 的星級評等而言,這會是 1。 就超過 50% 的利潤而言,這會是 50。
functions > magnitude > boostingRangeEnd 設定計算量級分數之範圍的結束值。 此值必須是整數或浮點數。 就 1 到 4 的星級評等而言,這會是 4。
functions > magnitude > constantBoostBeyondRange 有效值為 true 或 false (預設值)。 設為 true 時,完整提升仍會繼續套用至目標欄位的值高於範圍上限的文件。 如果為 false,則此函數的提升將不會套用至目標欄位的值超出範圍的文件。
functions > freshness 有效性計分函數可用來根據 DateTimeOffset 欄位中的值改變項目的排名分數。 例如,日期較近的項目可排在較舊項目之前。

也可以對未來日期行事曆事件這類項目進行排名,因此,越接近目前日期的項目排名會高於未來日期較遠的項目。

在最新的服務版本中,範圍的其中一端會固定為目前的時間。 另一端則是以 boostingDuration 為依據的過去時間。 若要提升未來的某個時間範圍,請使用負數的 boostingDuration。

從最大與最小範圍變更的提升比率,取決於套用至評分設定檔的插補 (請參閱下圖)。 若要反轉套用的提升係數,請選擇小於 1 的提升係數。
functions > freshness > boostingDuration 設定要開始停止對特定文件進行提升的到期時間。 如需語法和範例,請參閱下一節中的設定 boostingDuration
functions > distance distance 計分函式可用來根據文件與參考地理位置的距離,對文件的分數產生影響。 參考位置會以 lon,lat 引數的形式指定為參數中查詢的一部分 (使用 scoringParameter 查詢參數)。
functions > distance > referencePointParameter 要傳入查詢作為參考位置的參數 (使用 scoringParameter 查詢參數)。
functions > distance > boostingDistance 以公里為單位,設定與提升範圍結束處的參考位置相隔的距離。
functions > tag 標記計分函數可用來根據文件和搜尋查詢中的標記,對文件的分數產生影響。 將會提升擁有與搜尋查詢共通之標記的文件。 搜尋查詢的標記是以每個搜尋要求中的計分參數形式提供 (使用 scoringParameter 查詢參數)。
functions > tag > tagsParameter 要在查詢中傳遞的參數,可為特定要求指定標記 (使用 scoringParameter 查詢參數)。 參數是由以逗號分隔的完整字詞清單組成。 如果清單中的指定標記本身是逗號分隔清單,您可以對欄位使用文字正規化程式,在查詢時移除逗號 (將逗號字元對應至空格)。 此方法會將清單「壓平合併」,讓所有字詞都變成以逗號分隔的單一長字串。
functionAggregation 選擇性。 只有在已指定函數時才會套用。 有效值包括:sum (預設值)、average、minimum、maximum 和 firstMatching。 搜尋分數是從多個變數 (包含多個函式) 計算的單一值。 此屬性可指出所有函式如何結合為後續會套用至基準文件分數的單一彙總提升。 基準分數的基礎是從文件和搜尋查詢計算出來的 tf-idf 值。
defaultScoringProfile 執行搜尋要求時如果未指定評分設定檔,則會使用預設評分 (僅使用 tf-idf)。

您可以覆寫內建預設值,以自訂設定檔取代為搜尋要求中未提供特定設定檔時要使用的設定檔。

設定內插補點

插補可讓您設定用於評分的斜率圖形。 因為評分會由高至低排序,因此斜率一律為遞減,但插補可決定向下斜率的曲線。 可用的內插補點如下:

插補 描述
linear 對於在最大和最小範圍內的項目,套用至項目的提升將會已持續遞減的量執行。 線性是評分設定檔的預設插補。
constant 對於在開始和結束範圍內的項目,將會對排名結果套用常數提升。
quadratic 相較於採用持續遞減提升的線性插補,二次方程式一開始會以較小的步調減少,等到接近結束範圍時,再以較大的間隔減少。 tag 計分函式不允許使用此插補選項。
logarithmic 相較於採用持續遞減提升的線性插補,對數一開始會以較大的步調減少,等到接近結束範圍時,再以較小的間隔減少。 tag 計分函式不允許使用此插補選項。

Constant, linear, quadratic, log10 lines on graph

設定 boostingDuration

boostingDurationfreshness 函式的屬性。 您可以用它來設定要開始停止對特定文件進行提升的到期時間。 例如,若要在為期 10 天的促銷期間提升某個產品系列或品牌,您可以為這些文件指定 10 天的期間 "P10D"。

boostingDuration 必須格式化為 XSD "dayTimeDuration" 值 (ISO 8601 持續時間值的限定子集)。 其模式為:"P[nD][T[nH][nM][nS]]"。

下表提供數個範例。

期間 boostingDuration
1 天 "P1D"
2 天又 12 個小時 "P2DT12H"
15 分鐘 "PT15M"
30 天 5 小時 10 分鐘又 6.334 秒 "P30DT5H10M6.334S"

如需更多範例,請參閱 XML 結構描述:資料類型 (W3.org 網站)

延伸範例

下列範例說明具有兩個評分設定檔 (boostGenrenewAndHighlyRated) 的索引結構描述。 任何以其中一個設定檔做為查詢參數而對此索引所做的查詢,都將使用該設定檔為結果集評分。

boostGenre 設定檔使用加權文字欄位,提升在 albumTitle、genre 和 musicName 欄位中找到的相符項目。 欄位分別提升了 1.5、5 和 2。 為何內容類型提升的程度遠比其他多? 如果是對同質的資料進行搜尋 (如同 musicstoreindex 中的 'genre'),相對加權可能會需要較大的變異數。 例如,在 musicstoreindex 中,'rock' 不僅顯示為內容類型,也出現在措詞相同的內容類型說明中。 如果您要讓類型的權數高於類型說明,則類型欄位需要更高的相對權數。

{  
  "name": "musicstoreindex",  
  "fields": [  
    { "name": "key", "type": "Edm.String", "key": true },  
    { "name": "albumTitle", "type": "Edm.String" },  
    { "name": "albumUrl", "type": "Edm.String", "filterable": false },  
    { "name": "genre", "type": "Edm.String" },  
    { "name": "genreDescription", "type": "Edm.String", "filterable": false },  
    { "name": "artistName", "type": "Edm.String" },  
    { "name": "orderableOnline", "type": "Edm.Boolean" },  
    { "name": "rating", "type": "Edm.Int32" },  
    { "name": "tags", "type": "Collection(Edm.String)" },  
    { "name": "price", "type": "Edm.Double", "filterable": false },  
    { "name": "margin", "type": "Edm.Int32", "retrievable": false },  
    { "name": "inventory", "type": "Edm.Int32" },  
    { "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": "quadratic",  
          "freshness": {  
            "boostingDuration": "P365D"  
          }  
        },  
        {
          "type": "magnitude",  
          "fieldName": "rating",  
          "boost": 10,  
          "interpolation": "linear",  
          "magnitude": {  
            "boostingRangeStart": 1,  
            "boostingRangeEnd": 5,  
            "constantBoostBeyondRange": false  
          }  
        }  
      ]  
    }  
  ],  
  "suggesters": [  
    {  
      "name": "sg",  
      "searchMode": "analyzingInfixMatching",  
      "sourceFields": [ "albumTitle", "artistName" ]  
    }  
  ]   
}  

另請參閱