在 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
會設定剖析器: 簡單、 完整。 預設的簡單查詢剖析器最適合進行全文檢索搜尋。 完整的 Lucene 查詢剖析器適用於進階的查詢建構,例如規則運算式、鄰近搜尋、模糊和萬用字元搜尋。 此參數也可以針對查詢回應上的進階語意模型設定為語意排名的語意排名。searchMode
指定比對是以表達式中的所有準則(偏向有效位數)或任何準則(優先召回)為基礎。 預設為任何。 如果您預期大量使用布爾運算符,這更可能位於包含大型文本塊的索引中(內容欄位或長描述),請務必使用 參數來測試查詢searchMode=Any|All
,以評估該設定對布爾搜尋的影響。searchFields
會將查詢執行限制在特定的可搜尋欄位。 在開發期間,使用相同的欄位清單來進行選取和搜尋會很有幫助。 否則,比對基礎可能會是無法在結果中看到的欄位值,而無法確定傳回該文件的原因。
用來塑造回應的參數:
select
會指定要在回應中傳回的欄位。 只有標示為 可在索引中擷 取的欄位,才能在 select 語句中使用。top
會傳回指定數目的最相符文件。 在此範例中,只會傳回 10 個命中項目。 您可以使用 top 和 skip (未顯示) 將結果分頁。count
會告訴您整個索引中總共有多少個相符文件,此數目可能會超過傳回的數目。orderby
的使用時機是在您想要依值來排序結果時,例如評等或位置。 否則,預設值是使用相關性分數來為結果排名。 欄位必須屬性為 可 排序,才能成為此參數的候選專案。
選擇用戶端
針對早期開發和概念證明測試,請從 Azure 入口網站 或 REST 用戶端開始。 這些方法是互動式的,適用於目標測試,並協助您評估不同屬性的效果,而不需要編寫任何程式碼。
若要從應用程式內呼叫搜尋,請使用 Azure.Document.Search
適用於 .NET、Java、JavaScript 和 Python 的 Azure SDK 中的用戶端連結庫。
在入口網站中,當您開啟索引時,您可以在並排的索引標籤中使用 [搜尋總管] 以及索引 JSON 定義,以便輕易地存取欄位屬性。 請檢查欄位資料表,以查看哪些欄位在測試查詢時是「可搜尋」、「可排序」、「可篩選」和「可面向化」。
登入 Azure 入口網站,然後尋找您的搜尋服務。
在您的服務中,選取 [ 索引 ] 並選擇索引。
索引會開啟 [搜尋總管] 索引標籤,以便您立即查詢。 切換至 [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),以及前置詞(
*
如sea*
西雅圖和海濱的搜尋)。 一般建議先嘗試簡單的剖析器,然後在應用程式需求要求更強大的查詢時再轉向完整的剖析器。完整的 Lucene 查詢語法 (在您將
queryType=full
新增到要求時啟用) 是基於 Apache Lucene Parser。
完整語法和簡單語法會與同時支援相同前置詞和布爾運算的範圍重疊,但完整語法會提供更多運算符。 完整來說,布爾表達式有更多運算符,以及更多進階查詢的運算符,例如模糊搜尋、通配符搜尋、鄰近搜尋和正則表達式。
選擇查詢方法
搜尋基本上是使用者導向的操作,其中字詞或片語是從搜尋方塊收集,或是從頁面上按一下事件收集。 下表概述了您可以藉以收集使用者輸入的機制,以及預期的搜尋體驗。
輸入 | 體驗 |
---|---|
搜尋方法 | 使用者會在搜尋方塊中輸入字詞或片語,其中包含或不含運算元,然後選取 [搜尋 ] 以傳送要求。 搜尋可以在同一個要求上搭配篩選條件一起使用,但不能與自動完成或建議搭配使用。 |
自動完成方法 | 使用者輸入幾個字元,並在輸入每個新字元之後起始查詢。 回應是來自索引的完整字串。 如果提供的字串有效,使用者就會選取 [搜尋 ] 將該查詢傳送至服務。 |
建議方法 | 與自動完成一樣,使用者鍵入幾個字元之後即會產生累加查詢。 回應是相符文件的下拉清單,通常以幾個唯一或描述性欄位表示。 如果任一選取專案有效,使用者就會選取一個,並傳回相符的檔。 |
多面向導覽 | 會有一個頁面顯示可點選的導覽連結,或縮小搜尋範圍的階層連結。 多面向導覽結構會根據初始查詢動態組成。 例如, search=* 填入由每個可能類別所組成的多面向導覽樹狀結構。 多面向導覽結構是從查詢回應建立,但它也是表示下一個查詢的機制。 n REST API 參考,facets 會記載為搜尋文件作業的查詢參數,但它可以在沒有 search 參數的情況下使用。 |
篩選方法 | 篩選會與 Facet 搭配使用,以縮小結果範圍。 您也可以在頁面背後實作篩選,例如使用特定語言欄位來初始化頁面。 n REST API 參考,$filter 會記載為搜尋文件作業的查詢參數,但它可以在沒有 search 參數的情況下使用。 |
欄位屬性對查詢的作用
如果您熟悉查詢類型和撰寫,您可能記得查詢要求上的參數取決於索引中的欄位屬性。 例如,只有標示為可搜尋且可擷取的欄位才能用於查詢和搜尋結果。 在要求中設定 search
、filter
和 orderby
參數時,您應該檢查屬性以避免非預期的結果。
在下列旅館範例索引的螢幕快照中,只有最後兩個字段 LastRenovationDate 和 Rating 是可排序的,這是唯一"$orderby"
子句中使用的需求。
如需欄位屬性定義,請參閱建立索引 (REST API)。
標記對查詢的作用
在編制索引期間,搜尋引擎會在字串上使用文字分析器,以最大化在查詢時找到相符項的可能性。 至少,字串是小寫,但根據分析器的不同,也可能會進行詞形歸併還原和停止字詞移除。 較長的字串或複合字通常會以空格、連字號或破折號來分隔,並作為個別的標記來編制索引。
關鍵點是您認為索引包含的內容,以及其實際內容可能不同。 如果查詢未傳回預期的結果,您可以透過分析文字 (REST API) 來檢查分析器所建立的權杖。 如需標記化和查詢影響的詳細資訊,請參閱 部分字詞搜尋和具有特殊字元的模式。
相關內容
既然您對查詢要求的運作方式有更進一步的了解,請嘗試下列的快速入門來獲得實作經驗。