如何在Azure Cognitive Search中关联多张表并生成单一索引?
在Azure Cognitive Search中关联多张表创建单一索引的可行方案及操作方法
Azure Cognitive Search完全支持将多张关联表的数据整合到单一索引中,主要有两种常用实现方式,以下是具体操作步骤:
方式一:通过ETL预处理关联数据后导入
- 先在数据源端(比如Azure SQL Database)编写JOIN查询,将多张表的关联数据合并为扁平数据集或包含嵌套结构的数据集
- 使用Azure Data Factory、SSIS或自定义.NET代码完成数据的抽取、转换和加载(ETL),将处理后的数据写入中间存储(如单表、Blob存储的JSON文件)
- 基于预处理后的数据源创建Azure Cognitive Search索引器,将数据同步到目标索引中
- 示例:若有
Orders和Customers表,可通过SQL查询生成扁平数据:SELECT o.OrderId, o.OrderDate, c.CustomerName, c.Email FROM Orders o JOIN Customers c ON o.CustomerId = c.CustomerId
方式二:直接使用索引器的自定义查询关联多张表
针对支持复杂查询的数据源(如Azure SQL Database、SQL Server),无需预处理,可直接在数据源配置中指定关联查询:
- 步骤:
- 在Azure门户或通过.NET SDK创建数据源,指定类型(如
azuresql),并将query属性设为包含JOIN逻辑的查询语句 - 创建匹配关联数据结构的搜索索引,包含所有需检索的字段(如订单ID、日期、客户名称等)
- 创建索引器,关联上述数据源和索引,配置同步周期后启动,即可自动完成数据同步
- 在Azure门户或通过.NET SDK创建数据源,指定类型(如
- 简化版.NET代码示例:
var dataSource = new SearchIndexerDataSourceConnection( name: "joined-datasource", type: SearchIndexerDataSourceType.AzureSql, connectionString: "<你的SQL连接字符串>", query: "SELECT o.OrderId, o.OrderDate, c.CustomerName, c.Email FROM Orders o JOIN Customers c ON o.CustomerId = c.CustomerId" ); await searchClient.CreateOrUpdateDataSourceConnectionAsync(dataSource);
处理嵌套关联数据(可选)
若需保留表的层级关系(如一个订单对应多个明细),可在索引中定义嵌套字段:
- 将明细字段设置为
Collection(Edm.ComplexType)类型 - 通过SQL的
FOR JSON AUTO语法生成嵌套JSON结构,或在ETL过程中构造嵌套对象 - 示例SQL查询生成嵌套数据:
SELECT o.OrderId, o.OrderDate, c.CustomerName, (SELECT ProductId, Quantity FROM OrderDetails od WHERE od.OrderId = o.OrderId FOR JSON PATH) AS OrderDetails FROM Orders o JOIN Customers c ON o.CustomerId = c.CustomerId FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER
导入这类嵌套JSON数据后,即可支持嵌套字段的检索。
内容的提问来源于stack exchange,提问作者Azure Cloud Enthusiast
相关产品推荐
相关产品推荐

