如何在 Azure AI 搜尋中使用搜尋結果

本文說明如何在 Azure AI 搜尋中使用查詢回應。 回應的結構取決於查詢本身的參數,如搜尋檔 (REST)SearchResults 類別 (Azure for .NET) 中所述。

查詢上的參數會決定:

  • 欄位選取
  • 查詢索引中找到的相符項目計數
  • 分頁結果
  • 回應的結果數目 (預設最多 50 個)
  • 排序順序
  • 反白顯示結果中的字詞,比對主體中整個或部分字詞

結果組合

結果是由所有「可擷取」欄位的欄位所組成,或僅限於參數中指定的 $select 欄位。 數據列是相符的檔。

您可以選擇搜尋結果中的欄位。 雖然搜尋檔可能有大量的欄位,但通常只需要一些字段,才能在結果中代表每個檔。 在查詢要求上,附加 $select=<field list> 以指定回應中應該會出現哪些「可擷取」字段。

挑選提供檔對比和差異的欄位,提供足夠的資訊來邀請使用者一部分的點擊回應。 在電子商務網站上,可能是產品名稱、描述、品牌、色彩、大小、價格和評等。 針對內建 hotels-sample 索引,可能是下列範例中的「選取」字段:

POST /indexes/hotels-sample-index/docs/search?api-version=2020-06-30 
    {  
      "search": "sandy beaches",
      "select": "HotelId, HotelName, Description, Rating, Address/City"
      "count": true
    }

注意

針對結果中的影像,例如產品相片或標誌,將它們儲存在 Azure AI 搜尋服務之外,但在索引中新增字段以參考搜尋檔中的影像 URL。 示範結果中影像的範例索引包括 realestate-sample-us 示範(您可以在匯入數據精靈中輕鬆建置的內建範例數據集),以及 紐約市作業示範應用程式

非預期結果的 提示

偶爾,實質內容而不是結果的結構是意想不到的。 例如,您可能會發現某些結果似乎是重複的結果,或結果應該出現在頂端附近的結果位置較低。 當查詢結果非預期時,您可以嘗試這些查詢修改,以查看結果是否改善:

  • 將 [預設] searchMode=all 變更searchMode=any為 ,以要求符合所有準則,而不是任何準則。 當包含查詢的布爾運算符時,這尤其如此。

  • 試驗不同的語彙分析器或自定義分析器,以查看其是否變更查詢結果。 默認分析器會分解連字元字,並將單字減少為根窗體,這通常可改善查詢回應的健全性。 不過,如果您需要保留連字元,或字串包含特殊字元,您可能需要設定自定義分析器,以確保索引包含正確格式的令牌。 如需詳細資訊,請參閱具有特殊字元的部分字詞搜尋和模式(連字元、通配符、regex、模式)。

計算相符專案

count 參數會傳回索引中被視為符合查詢的檔數目。 若要傳回計數,請將 新增 $count=true 至查詢要求。 搜尋服務沒有加總值的最大值。 視您的查詢和文件內容而定,計數可能高達索引中的每個檔。

當索引穩定時,計數是正確的。 如果系統正在主動新增、更新或刪除檔,則計數會是近似的,不包括未完整編製索引的任何檔。

計數不會受到搜尋服務上的例行維護或其他工作負載影響。 不過,如果您有多個分割區和單一複本,在重新啟動分割區時,可能會發生檔計數(數分鐘)的短期波動。

提示

若要檢查索引編製作業,您可以藉由在空的搜尋search=*查詢上新增 $count=true ,確認索引是否包含預期的檔數目。 結果是索引中檔的完整計數。

測試查詢語法時, $count=true 可以快速告訴您修改是否傳回更大或更少的結果,這可以是有用的意見反應。

分頁結果

根據預設,搜尋引擎最多會傳回前 50 個相符專案。 前 50 名是由搜尋分數決定,假設查詢是全文搜索或語意。 否則,前50名是精確比對查詢的任意順序(其中統一的 “@searchScore=1.0” 表示任意排名)。

若要控制結果集中傳回之所有檔的分頁,請將 和 參數新增$top至 GET 查詢要求,或top新增skip至 POST 查詢$skip要求。 下列清單說明邏輯。

  • 傳回第一組 15 個相符的檔案加上總相符項目的計數: GET /indexes/<INDEX-NAME>/docs?search=<QUERY STRING>&$top=15&$skip=0&$count=true

  • 傳回第二個集合,略過前 15 個以取得下一個 15: $top=15&$skip=15。 針對第三組 15 重複: $top=15&$skip=30

如果基礎索引變更,編頁查詢的結果不保證穩定。 分頁會變更每個頁面的值 $skip ,但每個查詢都是獨立的,而且會在查詢時間的索引中運作,因為它存在於索引中(換句話說,結果沒有快取或快照集,例如在一般用途資料庫中找到的數據檢視)。

以下是如何取得重複專案的範例。 假設有四份檔的索引:

{ "id": "1", "rating": 5 }
{ "id": "2", "rating": 3 }
{ "id": "3", "rating": 2 }
{ "id": "4", "rating": 1 }

現在假設您想要一次傳回兩個結果,依評等排序。 您會執行此查詢以取得結果的第一頁: $top=2&$skip=0&$orderby=rating desc,併產生下列結果:

{ "id": "1", "rating": 5 }
{ "id": "2", "rating": 3 }

在服務上,假設第五份檔會新增至查詢呼叫之間的索引: { "id": "5", "rating": 4 }。 不久之後,您會執行查詢來擷取第二頁: $top=2&$skip=2&$orderby=rating desc,並取得下列結果:

{ "id": "2", "rating": 3 }
{ "id": "3", "rating": 2 }

請注意,檔 2 已擷取兩次。 這是因為新檔 5 具有更高的評等值,因此它會在檔 2 之前排序,並登陸第一頁。 雖然此行為可能非預期,但通常是搜尋引擎的行為。

逐頁查看大量結果

使用 $top 並允許 $skip 搜尋查詢逐頁流覽 100,000 個結果,但如果結果大於 100,000,該怎麼辦? 若要逐頁查看這個大型回應,請使用 排序順序範圍篩選 作為的因應措施 $skip

在此因應措施中,排序和篩選會套用至文件標識符欄位或每個檔唯一的另一個字段。 唯一欄位在搜尋索引中必須具有 filterablesortable 屬性。

  1. 發出查詢以傳回已排序結果的完整頁面。

    POST /indexes/good-books/docs/search?api-version=2020-06-30
        {  
          "search": "divine secrets",
          "top": 50,
          "orderby": "id asc"
        }
    
  2. 選擇搜尋查詢傳回的最後一個結果。 此處只會顯示只有 「id」 值的範例結果。

    {
        "id": "50"
    }
    
  3. 使用範圍查詢中的 「id」 值來擷取下一頁的結果。 這個 「id」 欄位應該具有唯一值,否則分頁可能包含重複的結果。

    POST /indexes/good-books/docs/search?api-version=2020-06-30
        {  
          "search": "divine secrets",
          "top": 50,
          "orderby": "id asc",
          "filter": "id ge 50"
        }
    
  4. 當查詢傳回零個結果時,分頁就會結束。

注意

只有在欄位第一次新增至索引時,才能啟用「可篩選」和「可排序」屬性,無法在現有欄位上啟用。

排序結果

在全文搜索查詢中,結果可以依下列方式進行排名:

  • 搜尋分數
  • 語意重新執行器分數
  • [可排序] 欄位上的排序順序

您也可以藉由新增評分配置檔來提升特定欄位中找到的任何相符專案。

依搜尋分數排序

針對全文搜索查詢,結果會自動 依搜尋分數進行排名,根據檔中的字詞頻率和鄰近性計算(衍生自 TF-IDF),分數較高的會移至在搜尋字詞上具有更多或更強相符項目的檔。

“@search.score” 範圍是未系結的,或 0 到 (但不包括) 1.00 在較舊的服務。

針對任一演算法,“@search.score” 等於 1.00 表示未評分或未評分的結果集,其中 1.0 分數在所有結果中都是統一的。 當查詢窗體模糊搜尋、通配符或 regex 查詢或空白搜尋時,就會發生未記錄的結果。search=* 如果您需要將排名結構強加於未記錄的結果,請考慮表達式 $orderby 以達成該目標。

依語意重新執行器排序

如果您使用 語意排名,“@search.rerankerScore” 會決定結果的排序順序。

“@search.rerankerScore” 範圍是 1 到 4.00,其中較高的分數表示更強的語意比對。

使用 $orderby 排序

如果一致的排序是應用程式需求,您可以在欄位上定義 $orderby 表達式 。 只有索引為「可排序」的欄位才能用來排序結果。

通常用於包含評等、日期和位置的 $orderby 欄位。 除了功能變數名稱之外,依位置篩選需要篩選表達式呼叫geo.distance()函式。

數值欄位(Edm.Double、Edm.Int32、Edm.Int64)會依數值順序排序(例如,1、2、10、11、20)。

字串字位 (Edm.String, Edm.ComplexType 子欄位) 會 根據語言,以 ASCII 排序順序Unicode 排序順序排序。 您無法排序任何類型的集合。

  • 字串欄位中的數值內容會依字母順序排序(1、10、11、2、20)。

  • 大寫字串在小寫之前排序(APPLE、Apple、BANANA、香蕉、蘋果、香蕉)。 您可以指派 文字正規化程式 來前置處理文字,再排序以變更此行為。 在欄位上使用小寫Tokenizer不會影響排序行為,因為 Azure AI 搜尋會在字段的非分析複本上排序。

  • 以變音符號開頭的字串最後出現 (Äpfel, Öffnen, Üben)

使用評分配置檔提升相關性

提升訂單一致性的另一 種方法是使用自定義評分配置檔。 評分配置檔可讓您更充分掌控搜尋結果中的專案排名,並能夠提升在特定欄位中找到的相符專案。 額外的評分邏輯有助於覆寫複本之間的次要差異,因為每個檔的搜尋分數相距較遠。 我們建議此方法的 排名演算法

點擊醒目提示

點擊醒目提示是指文字格式設定(例如粗體或黃色醒目提示)套用至結果中的相符字詞,讓您輕鬆找出相符專案。 醒目提示適用於較長的內容欄位,例如描述欄位,其中比對並不明顯。

請注意,醒目提示會套用至個別字詞。 整個欄位的內容沒有醒目提示功能。 如果您想要在片語上反白顯示,您必須在引號括住的查詢字串中提供相符的字詞(或片語)。 本節會進一步說明這項技術。

查詢要求提供叫用醒目提示指示。 在引擎中觸發查詢擴充的查詢,例如模糊和通配符搜尋,對點擊醒目提示的支援有限。

點擊醒目提示的需求

  • 欄位必須是 Edm.StringCollection(Edm.String)
  • 欄位必須在可搜尋時 屬性

在要求中指定醒目提示

若要傳回醒目提示的字詞,請在查詢要求中包含 「highlight」 參數。 參數會設定為以逗號分隔的欄位清單。

根據預設,格式標示為 <em>,但您可以使用 和 highlightPostTag 參數覆寫標記highlightPreTag。 您的用戶端程式代碼會處理回應(例如,套用粗體字型或黃色背景)。

POST /indexes/good-books/docs/search?api-version=2020-06-30 
    {  
      "search": "divine secrets",  
      "highlight": "title, original_title",
      "highlightPreTag": "<b>",
      "highlightPostTag": "</b>"
    }

根據預設,Azure AI 搜尋會傳回每個欄位最多五個醒目提示。 您可以藉由附加虛線後面接著整數來調整此數位。 例如,在 [描述] 字段中, "highlight": "description-10" 傳回最多 10 個醒目提示的字詞比對內容。

醒目提示的結果

將醒目提示新增至查詢時,回應會包含每個結果的「@search.highlight」,讓應用程式程式代碼可以鎖定該結構。 回應中包含為 「醒目提示」指定的欄位清單。

在關鍵詞搜尋中,會個別掃描每個字詞。 「神聖秘密」的查詢會傳回任何包含任一字詞的檔相符專案。

在片語查詢上醒目提示的螢幕快照。

關鍵詞搜尋醒目提示

在醒目提示的欄位中,格式設定會套用至整個字詞。 例如,在與「雅雅姐妹的神聖秘密」的相符專案上,格式會分別套用至每個字詞,即使它們是連續的。

"@odata.count": 39,
"value": [
    {
        "@search.score": 19.593246,
        "@search.highlights": {
            "original_title": [
                "<em>Divine</em> <em>Secrets</em> of the Ya-Ya Sisterhood"
            ],
            "title": [
                "<em>Divine</em> <em>Secrets</em> of the Ya-Ya Sisterhood"
            ]
        },
        "original_title": "Divine Secrets of the Ya-Ya Sisterhood",
        "title": "Divine Secrets of the Ya-Ya Sisterhood"
    },
    {
        "@search.score": 12.779835,
        "@search.highlights": {
            "original_title": [
                "<em>Divine</em> Madness"
            ],
            "title": [
                "<em>Divine</em> Madness (Cherub, #5)"
            ]
        },
        "original_title": "Divine Madness",
        "title": "Divine Madness (Cherub, #5)"
    },
    {
        "@search.score": 12.62534,
        "@search.highlights": {
            "original_title": [
                "Grave <em>Secrets</em>"
            ],
            "title": [
                "Grave <em>Secrets</em> (Temperance Brennan, #5)"
            ]
        },
        "original_title": "Grave Secrets",
        "title": "Grave Secrets (Temperance Brennan, #5)"
    }
]

片語搜尋醒目提示

神秘 詞彙格式設定即使在片語搜尋上也適用,其中多個字詞會以雙引號括住。 下列範例是相同的查詢,不同之處在於「神聖的秘密」會以引號括住的片語提交(某些 REST 用戶端要求您以反斜杠 \"逸出內部引號):

POST /indexes/good-books/docs/search?api-version=2020-06-30 
    {  
      "search": "\"divine secrets\"",,
      "select": "title,original_title",
      "highlight": "title",
      "highlightPreTag": "<b>",
      "highlightPostTag": "</b>",
      "count": true
    }

因為準則現在有這兩個詞彙,搜尋索引中只會找到一個相符專案。 上述查詢的回應如下所示:

{
    "@odata.count": 1,
    "value": [
        {
            "@search.score": 19.593246,
            "@search.highlights": {
                "title": [
                    "<b>Divine</b> <b>Secrets</b> of the Ya-Ya Sisterhood"
                ]
            },
            "original_title": "Divine Secrets of the Ya-Ya Sisterhood",
            "title": "Divine Secrets of the Ya-Ya Sisterhood"
        }
    ]
}

舊版服務的片語醒目提示

在 2020 年 7 月 15 日之前建立的 搜尋服務 會針對片語查詢實作不同的醒目提示體驗。

針對下列範例,假設查詢字串包含引號括住的片語 “super bowl”。 在 2020 年 7 月之前,會反白顯示片語中的任何字詞:

"@search.highlights": {
    "sentence": [
        "The <em>super</em> <em>bowl</em> is <em>super</em> awesome with a <em>bowl</em> of chips"
   ]

對於在 2020 年 7 月之後建立的搜尋服務,只有符合完整片語查詢的片語會在 “@search.highlights” 中傳回:

"@search.highlights": {
    "sentence": [
        "The <em>super</em> <em>bowl</em> is super awesome with a bowl of chips"
   ]

下一步

若要快速為您的客戶端產生搜尋頁面,請考慮下列選項: