共用方式為


在 Azure AI 搜尋服務中建立全文檢索查詢

如果您要建置全文檢索搜尋的查詢,本文會提供設定要求的步驟。 它也會介紹查詢結構,並說明欄位屬性和語言分析器如何影響查詢結果。

必要條件

全文檢索查詢要求的範例

在 Azure AI 搜尋服務中,查詢是針對單一搜尋索引文件集合的唯讀要求,其參數既通知查詢執行,又影響傳回的回應。

全文檢索查詢是在 search 參數中指定,由字詞、引號括住的片語和運算子所組成。 其他參數會將更多定義新增至要求。

下列搜尋 POST REST API 呼叫說明使用上述參數的查詢要求。

POST https://[service name].search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2024-07-01
{
    "search": "NY +view",
    "queryType": "simple",
    "searchMode": "all",
    "searchFields": "HotelName, Description, Address/City, Address/StateProvince, Tags",
    "select": "HotelName, Description, Address/City, Address/StateProvince, Tags",
    "top": "10",
    "count": "true"
}

重點︰

  • search 會提供比對準則,通常是整個字詞或片語,且包含或不含運算子。 在索引結構描述中屬性化為「可搜尋」的任何欄位,都是此參數的候選項目。

  • queryType 設定剖析器:simplefull預設的簡單查詢剖析器最適合進行全文檢索搜尋。 完整的 Lucene 查詢剖析器適用於進階的查詢建構,例如規則運算式、鄰近搜尋、模糊和萬用字元搜尋。 您也可以將此參數設定為 semantic,以用於對查詢回應進行進階語義建模的語義排名

  • searchMode 會指定比對基礎是運算式中的「全部」準則 (有利於精確度) 還是「任何」準則 (有利於重新叫用)。 預設值為「任何」。 如果您預期會大量使用布林運算子,包含大型文字區塊 (內容欄位或完整說明) 的索引很可能會這麼做,請務必使用 searchMode=Any|All 參數來測試查詢,以評估該設定對布林搜尋的影響。

  • searchFields 會將查詢執行限制在特定的可搜尋欄位。 在開發期間,使用相同的欄位清單來進行選取和搜尋會很有幫助。 否則,比對基礎可能會是無法在結果中看到的欄位值,而無法確定傳回該文件的原因。

用來塑造回應的參數:

  • select 會指定要在回應中傳回的欄位。 只有在索引中標示為「可擷取」的欄位,才能在 select 陳述式中使用。

  • top 會傳回指定數目的最相符文件。 在此範例中,只會傳回 10 個命中項目。 您可以使用 top 和 skip (未顯示) 將結果分頁。

  • count 會告訴您整個索引中總共有多少個相符文件,此數目可能會超過傳回的數目。

  • orderby 的使用時機是在您想要依值來排序結果時,例如評等或位置。 否則,預設值是使用相關性分數來為結果排名。 欄位必須屬性化為「可排序」,才能成為此參數的候選項目。

選擇用戶端

若要進行早期開發和概念證明測試,請使用 Azure 入口網站或 REST 用戶端開始作業。 這些方法是互動式的,適用於目標測試,並協助您評估不同屬性的效果,而不需要編寫任何程式碼。

若要從應用程式內呼叫搜尋,請使用適用於 .NET、Java、JavaScript 和 Python 的 Azure SDK 中的 Azure.Document.Search 用戶端程式庫。

在入口網站中,當您開啟索引時,您可以在並排的索引標籤中使用 [搜尋總管] 以及索引 JSON 定義,以便輕易地存取欄位屬性。 請檢查欄位資料表,以查看哪些欄位在測試查詢時是「可搜尋」、「可排序」、「可篩選」和「可面向化」。

  1. 登入 Azure 入口網站,然後尋找您的搜尋服務

  2. 開啟 [索引],然後選取索引。

  3. 索引會開啟 [搜尋總管] 索引標籤,以便您立即查詢。 切換至 [JSON 檢視] 以指定查詢語法。

    以下是適用於 Hotels 範例索引的全文搜尋查詢表示式:

       {
           "search": "pool spa +airport",
           "queryType": "simple",
           "searchMode": "any",
           "searchFields": "Description, Tags",
           "select": "HotelName, Description, Tags",
           "top": 10,
           "count": true
       }
    

    以下螢幕擷取畫面說明查詢和回應:

    [搜尋總管] 的螢幕擷取畫面,其中包含全文檢索查詢。

選取查詢類型:簡單| 完整

如果您的查詢是全文檢索搜尋,則查詢剖析器會用來處理以搜尋字詞和片語的形式傳遞的任何文字。 Azure AI 搜尋服務提供兩個查詢剖析器。

  • 簡單剖析器了解簡單的查詢語法。 此剖析器因其在自由格式文字查詢中的速度和有效性而被選為預設的剖析器。 語法支援常見的搜尋運算子 (AND、OR、NOT),其用於字詞和片語搜尋 以及前置字元 (*) 搜尋 (如 Seattle 和 Seaside 中的 "sea*")。 一般建議先嘗試簡單的剖析器,然後在應用程式需求要求更強大的查詢時再轉向完整的剖析器。

  • 完整的 Lucene 查詢語法 (在您將 queryType=full 新增到要求時啟用) 是基於 Apache Lucene Parser

完整語法和簡單語法在某種程度上重疊,它們兩個都支援相同的前置詞和布林運算,但完整語法提供了更多的運算子。 完整來說,布林運算式有更多的運算子,而對於進階查詢 (例如模糊搜尋、萬用字元搜尋、鄰近搜尋和規則運算式) 也有更多的運算子。

選擇查詢方法

搜尋基本上是使用者導向的操作,其中字詞或片語是從搜尋方塊收集,或是從頁面上按一下事件收集。 下表概述了您可以藉以收集使用者輸入的機制,以及預期的搜尋體驗。

輸入 體驗
搜尋方法 使用者會在搜尋方塊中輸入字詞或片語,其中包含或不含運算子,然後按一下 [搜尋] 來傳送要求。 搜尋可以在同一個要求上搭配篩選條件一起使用,但不能與自動完成或建議搭配使用。
自動完成方法 使用者輸入幾個字元,並在輸入每個新字元之後起始查詢。 回應是來自索引的完整字串。 如果提供的字串有效,使用者會按一下 [搜尋] 以將該查詢傳送至服務。
建議方法 與自動完成一樣,使用者鍵入幾個字元之後即會產生累加查詢。 回應是相符文件的下拉清單,通常以幾個唯一或描述性欄位表示。 如果有任何選項有效,使用者會按一下其中一項,然後會傳回相符的文件。
多面向導覽 會有一個頁面顯示可點選的導覽連結,或縮小搜尋範圍的階層連結。 多面向導覽結構會根據初始查詢動態組成。 例如, search=* 填入由每個可能類別所組成的多面向導覽樹狀結構。 多面向導覽結構是從查詢回應建立,但它也是表示下一個查詢的機制。 n REST API 參考,facets 會記載為搜尋文件作業的查詢參數,但它可以在沒有 search 參數的情況下使用。
篩選方法 篩選會與 Facet 搭配使用,以縮小結果範圍。 您也可以在頁面背後實作篩選,例如使用特定語言欄位來初始化頁面。 n REST API 參考,$filter 會記載為搜尋文件作業的查詢參數,但它可以在沒有 search 參數的情況下使用。

欄位屬性對查詢的作用

如果您熟悉查詢類型和撰寫,您可能記得查詢要求上的參數取決於索引中的欄位屬性。 例如,只有標示為 searchableretrievable 的欄位可用於查詢和搜尋結果。 在要求中設定 searchfilterorderby 參數時,您應該檢查屬性以避免非預期的結果。

在入口網站螢幕擷取畫面中的 hotels 範例索引下面,只有最後兩個欄位 「LastRenovationDate」和「Rating」為 sortable,在僅限 "$orderby" 的子句中使用的話為必要項。

旅館範例的索引定義

如需欄位屬性定義,請參閱建立索引 (REST API)

標記對查詢的作用

在編制索引期間,搜尋引擎會在字串上使用文字分析器,以最大化在查詢時找到相符項的可能性。 至少,字串是小寫,但根據分析器的不同,也可能會進行詞形歸併還原和停止字詞移除。 較長的字串或複合字通常會以空格、連字號或破折號來分隔,並作為個別的標記來編制索引。

這裡要指出的一點是,您認為索引包含的內容和其中實際包含的內容可能不同。 如果查詢未傳回預期的結果,您可以透過分析文字 (REST API) 來檢查分析器所建立的權杖。 如需標記化和查詢影響的詳細資訊,請參閱具有特殊字元的部分字詞搜尋和模式

下一步

既然您對查詢要求的運作方式有更進一步的了解,請嘗試下列的快速入門來獲得實作經驗。