在 Azure AI 搜索中将数据加载到搜索索引
本文介绍如何将文档导入预定义的搜索索引。 在 Azure AI 搜索中,先创建搜索索引,接着的第二步是导入数据。 例外情况是门户和索引器管道中的导入向导,它们在一个工作流中创建并加载索引。
数据导入的工作原理
搜索服务接受符合索引架构的 JSON 文档。 搜索服务导入 JSON 中的纯文本和矢量并建立索引,用于全文搜索、矢量搜索、混合搜索和知识挖掘方案。
纯文本内容可从外部数据源中的字母数字字段、搜索场景中有用的元数据或技能组创建的丰富内容(技能可以从图像和非结构化内容中提取或推断文本描述)中获取。
你可自行准备这些文档,但是如果内容驻留在支持的数据源中,那么运行索引器或使用导入向导可自动完成文档检索、JSON 序列化和索引。
索引数据后,索引的物理数据结构将被锁定。 有关可更改和不可更改的内容的指南,请参阅更新并重新生成索引。
索引不是一个后台进程。 搜索服务将对索引和查询工作负载进行均衡,但是如果查询延迟太长,则可以添加容量,也可确定用于加载索引的较低查询活动的时间段。
有关详细信息,请参阅数据导入策略。
使用 Azure 门户
在 Azure 门户中,使用导入向导在无缝工作流中创建和加载索引。 如果要加载现有索引,请选择替代方法。
在概述页面中选择命令栏上的“导入数据”或“导入并矢量化数据”,以创建和填充搜索索引。
可以点击以下链接查看工作流:快速入门:创建 Azure AI 搜索索引和快速入门:集成矢量化。
向导完成后,使用搜索资源管理器检查结果。
提示
导入向导会创建并运行索引器。 如果已定义索引器,则可以从 Azure 门户重置并运行索引器,这在以增量方式添加字段时非常有用。 重置会迫使索引器重头开始,从所有源文档中选取所有字段。
使用 REST API
文档 - 索引是用于将数据导入搜索索引的 REST API。 REST API 适用于初始概念验证测试,可以在其中测试索引工作流,而无需编写大量代码。 @search.action
参数根据特定字段的新值或替换值确定是部分还是全部添加文档。
相关步骤,请参阅快速入门:使用 REST 进行文本搜索。 下面的示例是修改后的示例版本。 为了简洁起见,已对该示例进行修整,第一个 HotelId 值已修改,避免覆盖现有文档。
构建一个 POST 调用,用于指定索引名称、“docs/index”终结点,以及一个包含
@search.action
参数的请求正文。POST https://[service name].search.azure.cn/indexes/hotels-sample-index/docs/index?api-version=2024-07-01 Content-Type: application/json api-key: [admin key] { "value": [ { "@search.action": "upload", "HotelId": "1111", "HotelName": "Stay-Kay City Hotel", "Description": "The hotel is ideally located on the main commercial artery of the city in the heart of Beijing. A few minutes away is Time's Square and the historic centre of the city, as well as other places of interest that make Beijing one of America's most attractive and cosmopolitan cities.", "Category": "Boutique", "Tags": [ "pool", "air conditioning", "concierge" ] }, { "@search.action": "mergeOrUpload", "HotelId": "2", "HotelName": "Old Century Hotel", "Description": "This is description is replacing the original one for this hotel. New and changed values overwrite the previous ones. In a comma-delimited list like Tags, be sure to provide the full list because there is no merging of values within the field itself.", "Category": "Boutique", "Tags": [ "pool", "free wifi", "concierge", "my first new tag", "my second new tag" ] } ] }
将
@search.action
参数设置为upload
以创建或覆盖文档。 如果要更新文档中的特定字段,请将其设置为merge
或uploadOrMerge
。 上一个示例显示了这两个操作。操作 效果 merge 更新已存在的文档,如果找不到该文档,则会失败。 合并将替换现有值。 因此,请务必检查是否有包含多个值的集合字段,例如类型为 Collection(Edm.String)
的字段。 例如,如果tags
字段以["budget"]
值开头,并且你执行与["economy", "pool"]
的合并,则tags
字段的最终值为["economy", "pool"]
。 而不会是["budget", "economy", "pool"]
。mergeOrUpload 如果文档已存在,则行为类似于合并;如果文档是新的,则类似于上传。 这是增量更新的最常见操作。 upload 类似于“更新插入”,如果文档是新文档,则插入;如果文档已经存在,则进行更新或替换。 如果文档缺少索引所需的值,则将文档字段的值设置为 null。 发送请求。
查找你刚才添加为验证步骤的文档:
GET https://[service name].search.azure.cn/indexes/hotel-sample-index/docs/1111?api-version=2024-07-01
如果文档键或 ID 是新的,则 null 将成为文档中未指定的任何字段的值。 对于现有文档上的操作,更新后的值将替换之前的值。 “merge”或“mergeUpload”未指定的任何字段都在搜索索引中保持不变。
使用 Azure SDK
以下 Azure SDK 中提供了可编程性。
Azure SDK for .NET 提供以下 API,用于将简单和批量文档上传到索引中:
有几个示例来阐释简单和大规模索引上下文中的索引: