如何在 Azure 認知搜尋中使用搜尋結果

本文說明如何在Azure 認知搜尋中使用查詢回應。 回應的結構取決於查詢本身的參數,如 搜尋檔 (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 認知搜尋之外,但請在索引中包含欄位,以參考搜尋檔中的影像 URL。 支援結果中影像的範例索引包括 realestate-sample-us 示範 (內建範例資料集,您可以在匯入資料精靈) 和 紐約市作業示範應用程式中輕鬆建置。

未預期結果的提示

有時候,結果的本質和結構會不符預期的。 例如,您可能會發現某些結果似乎重複,或 應該 出現在頂端附近的結果位於結果中較低的位置。 當查詢結果非預期時,您可以嘗試這些查詢修改,以查看結果是否改善:

  • searchMode=any (預設值) 變更為 searchMode=all,以要求須符合所有準則,而非任何準則。 此做法在查詢中包含布林運算子時特別有用。

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

計算相符專案

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

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

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

秘訣

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

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

分頁結果

根據預設,搜尋引擎最多會傳回前 50 個相符專案。 前 50 名是由搜尋分數決定,假設查詢是全文檢索搜尋或語意搜尋。 否則,前 50 個是完全相符查詢的任意順序, (其中 「@searchScore=1.0」) 。

若要控制結果集中傳回之所有檔的分頁,請將 和 參數新增 $top$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 之前排序,並進入第一頁。 雖然此行為可能未預期,但通常是搜尋引擎的行為。

排序結果

在全文檢索搜尋查詢中,如果使用 意搜尋) ,或是查詢 $orderby 要求中的運算式,結果可以依搜尋分數、語意重新排名器分數 (來排名。

@search.score等於 1.00 表示未評分或未排名的結果集,其中 1.0 分數在所有結果中都是一致的。 當查詢表單模糊搜尋、萬用字元或 RegEx 查詢,或空白搜尋 (search=*) 時,就會發生未評分的結果。 如果您需要對未評分的結果施加排名結構, $orderby 運算式將協助您達成該目標。

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

搜尋分數傳達相關性的一般意義,反映與相同結果集中其他檔相對的比對強度。 但分數不一定會從一個查詢到下一個查詢一致,因此當您使用查詢時,您可能會注意到搜尋檔排序方式有些不一致。 原因有數個說明。

原因 描述
資料變動 當您新增、修改或刪除檔時,索引內容會有所不同。 當索引更新經過一段時間後,詞彙頻率將會變更,因而影響相符檔的搜尋分數。
多個複本 對於使用多個複本的服務,會平行對每個複本發出查詢。 用來計算搜尋分數的索引統計資料是以每個複本為基礎來計算,並在查詢回應中合併和排序結果。 複本大多是彼此的鏡像,但統計資料可能會因為狀態的差異很小而有所不同。 例如,一個複本可能會刪除參與其統計資料的檔,這些檔已從其他複本合併。 一般而言,個別複本統計資料的差異在較小的索引中較明顯。 如需此條件的詳細資訊,請參閱容量規劃檔中 的概念:搜尋單位、複本、分割區、分區
相同的分數 如果多個檔具有相同分數,其中任何一份檔可能會先出現。

如何取得一致的排序

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

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

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

搜尋結果醒目提示

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

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

查詢 要求會提供點擊醒目提示指示。 觸發引擎中查詢擴充的查詢,例如模糊和萬用字元搜尋,對點擊醒目提示的支援有限。

點擊醒目提示的需求

  • 欄位必須是 Edm.String 或集合 (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 認知搜尋最多會傳回五個醒目提示。 您可以附加虛線後面接著整數來調整此數位。 例如, "highlight": "description-10" 在 [描述] 欄位中傳回最多 10 個醒目提示的字詞比對內容。

醒目提示的結果

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

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

醒目提示片語查詢的螢幕擷取畫面。

關鍵字搜尋醒目提示

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

"@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)"
    }

片語搜尋醒目提示

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

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 cup」。 在 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"
   ]

下一步

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

  • 在入口網站中,應用程式產生器會建立 HTML 頁面,其中包含影像的搜尋列、多面向導覽和結果區域。

  • 在 C# 中建立您的第一個應用程式 是建置功能用戶端的教學課程和程式碼範例。 範例程式碼示範編頁查詢、點擊醒目提示和排序。

  • 將搜尋新增至 Web 應用程式是教學課程和程式碼範例,會針對使用者體驗使用 React JavaScript 程式庫。 應用程式會使用 Azure Static Web Apps 進行部署。