在 Azure AI 搜索中为多种语言创建索引
如果有多种语言的字符串,则可以附加语言分析器,用于在索引编制和查询执行期间使用特定语言的语言规则来分析字符串。 借助语言分析器,你可以更好地处理字符变体、标点符号和词根形式。
Azure AI 搜索支持 Azure 和 Lucene 分析器。 默认情况下,搜索引擎使用与语言无关的标准 Lucene。 如果测试表明默认分析器功能不足,请将其替换为某个语言分析器。
在 Azure AI 搜索中,用于支持多种语言的两种模式包括:
创建特定于语言的索引,其中所有字母数字内容都使用相同的语言,所有可搜索字符串字段都归为使用相同的语言分析器。
使用每个字段的特定于语言的版本(例如,description_en、description_fr、description_ko)创建混合索引,然后在查询时将全文搜索限制为仅搜索这些字段。 此方法适用于仅在几个字段(如说明)上需要语言变体的情况。
本文重点介绍在混合索引中配置和查询特定于语言的字段的步骤和最佳做法:
- 为每个语言变体定义一个字符串字段。
- 在每个字段上设置一个语言分析器。
- 在查询请求中设置特定字段的
searchFields
参数,然后使用select
来只返回那些具有兼容内容的字段。
注意
如果你在检索增强生成 (RAG) 模式下使用大语言模型,则可以设计提示来返回翻译后的字符串。 该方案超出了本文的范围。
先决条件
语言分析适用于类型为具有 searchable
特性的 Edm.String
且包含本地化文本的字段。 如果还需要文本翻译,请查看下一部分,了解 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.azure.cn/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": "englishFirst",
"text": {
"weights": { "description": 2 }
}
}
]
然后,将计分概要文件添加到搜索请求中:
POST /indexes/hotels/docs/search?api-version=2020-06-30
{
"search": "pets allowed",
"searchFields": "Tags, Description",
"select": "HotelName, Tags, Description",
"scoringProfile": "englishFirst",
"count": "true"
}