在 Azure AI 搜尋服務中建立多種語言的索引
如果您有多種語言的字串,您可以附加語言分析器,在編製索引和查詢執行期間,使用特定語言的語言規則來分析字串。 透過語言分析器,您可以更妥善地處理字元變化、標點符號和字根形式。
Azure AI 搜尋服務支援 Microsoft 和 Lucene 分析器。 根據預設,搜尋引擎會使用與語言無關的標準 Lucene。 如果測試指出預設分析器不足,請將它替代為語言分析器。
在 Azure AI 搜尋服務中,支援多種語言的兩種模式包括:
建立語言特定索引,其中所有英數字元內容都使用相同的語言,而且所有可搜尋的字串欄位都歸因於使用相同的語言分析器。
使用每個欄位的語言特定版本建立混合索引 (例如,description_en、description_fr、description_ko),然後在查詢時間將全文搜索限制為僅包含這些欄位。 這種方法適用於只有幾個欄位需要語言變體的情節,例如描述。
本文著重於在混合索引中設定和查詢特定語言欄位的步驟和最佳做法:
- 定義每個語言變體的字串欄位。
- 在每個欄位上設定語言分析器。
- 在查詢要求上,將
searchFields
參數設定為特定欄位,然後使用select
只傳回具有相容內容的欄位。
注意
如果您在擷取增強生成 (RAG) 模式中使用大型語言模型,您可以設計提示以傳回翻譯後的字串。 該情節不在本文的說明範圍內。
必要條件
語言分析適用於 Edm.String
且包含當地語系化文字之 searchable
類型的欄位。 如果您需要文字翻譯,請檢閱下一節,以查看 AI 擴充是否符合您的需求。
非字串欄位和不可搜尋的字串欄位不會進行語彙分析,也不會進行權杖化。 相反地,它們會逐字儲存並傳回。
新增文字翻譯
本文假設翻譯的字串已經存在。 如果不是這種情況,您可以將 Azure AI 服務連結至擴充管線,進而在編製索引期間叫用文字翻譯。 文字翻譯會相依於索引子功能和 Azure AI 服務,但所有設定都是在 Azure AI 搜尋服務內完成。
若要新增文字翻譯,請遵循下列步驟:
驗證您的內容是否位於支援的資料來源中。
建立一個資料來源,指向您的內容。
-
文字翻譯技能會採用單一字串做為輸入。 如果您有多個欄位,則可以一個技能集,多次呼叫文字翻譯,每個欄位一次。 或者,您可以使用文字合併技能,將多個欄位的內容合併成一個長字串。
建立一個索引,其中包含已翻譯字串的欄位。 本文大部分涵蓋索引設計和欄位定義,用於編制索引和查詢多語言內容。
將多區域 Azure AI 服務資源附加至您的技能集。
建立並執行索引子,然後套用本文中的指引,只查詢感興趣的欄位。
定義適用於不同語言內容的欄位
在 Azure AI 搜尋服務中,查詢是以單一索引為目標。 想要在單一搜尋體驗中提供特定語言之字串的開發人員,通常會定義專用欄位來儲存值:一個適用於英文字串的欄位、一個適用於法文,依此類推。
欄位定義的 analyzer
屬性是用來設定語言分析器。 其將會同時用於編製索引和查詢執行。
{
"name": "hotels-sample-index",
"fields": [
{
"name": "Description",
"type": "Edm.String",
"retrievable": true,
"searchable": true,
"analyzer": "en.microsoft"
},
{
"name": "Description_fr",
"type": "Edm.String",
"retrievable": true,
"searchable": true,
"analyzer": "fr.microsoft"
}
]
}
建置和載入索引
中繼步驟是在制定查詢之前建置並移入索引。 我們基於完整性而在這裡提及此步驟。 判斷索引可用性的一種方法是在入口網站中檢查索引清單。
限制查詢與調整結果
查詢上的參數可用來限制搜尋特定欄位,然後調整任何對您案例不是很有助益之欄位的結果。
參數 | 目的 |
---|---|
searchFields |
限制只對具名欄位清單進行全文檢索搜尋。 |
select |
調整回應,只包含您指定的欄位。 預設會傳回所有可擷取的欄位。 select 參數可讓您選擇要傳回哪些欄位。 |
假設目標為限制搜尋包含法文字串的欄位,則您會使用 searchFields
,將目標設為查詢包含該語言之字串的欄位。
不需要在查詢要求上指定分析器。 欄位定義上的語言分析器會決定查詢執行期間的文字分析。 對於指定多個欄位的查詢,每一個都會呼叫不同的語言分析器,術語或片語會由每個欄位的指派分析器同時處理。
根據預設,搜尋會傳回所有標記為可擷取的欄位。 因此,針對您想要提供的特定語言搜尋體驗,您可以排除不符合的欄位。 具體來說,如果您限制搜尋具法文字串的欄位,則可能想要從結果中排除具英文字串的欄位。 使用 select
查詢參數,可讓您控制要將哪些欄位傳回呼叫應用程式。
REST 中的範例
POST https://[service name].search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2024-07-01
{
"search": "animaux acceptés",
"searchFields": "Tags, Description_fr",
"select": "HotelName, Description_fr, Address/City, Address/StateProvince, Tags",
"count": "true"
}
C# 中的範例
private static void RunQueries(SearchClient srchclient)
{
SearchOptions options;
SearchResults<Hotel> response;
options = new SearchOptions()
{
IncludeTotalCount = true,
Filter = "",
OrderBy = { "" }
};
options.Select.Add("HotelId");
options.Select.Add("HotelName");
options.Select.Add("Description_fr");
options.SearchFields.Add("Tags");
options.SearchFields.Add("Description_fr");
response = srchclient.Search<Hotel>("*", options);
WriteDocuments(response);
}
提升語言特定欄位
有時候不知道發出查詢的代理程式語言,在此情況下,可以針對所有欄位同時發出查詢。 您可以使用評分設定檔來定義特定語言中結果的喜好設定。 在下面範例中,相對於其他語言的相符項目,在法文描述中找到的相符項目會有較高的評分:
"scoringProfiles": [
{
"name": "frenchFirst",
"text": {
"weights": { "description_fr": 2 }
}
}
]
接著,您會在搜尋要求中包含評分設定檔:
POST /indexes/hotels/docs/search?api-version=2024-07-01
{
"search": "pets allowed",
"searchFields": "Tags, Description_fr",
"select": "HotelName, Tags, Description_fr",
"scoringProfile": "frenchFirst",
"count": "true"
}