c# - 在 Azure 认知搜索中将 2 个 Azure SQL 表合并为 1 个索引
问题描述
我正在关注如何将 2 个不同的数据源组合到 1 个索引中的示例,结果正是我想要的:来自一个数据源的索引酒店,每个都有来自另一个数据源的房间详细信息数组(或列表)。
就我而言,我的两个数据源都来自一个不使用分区键的 Azure SQL 数据库:
DataSource hotelSource = DataSource.AzureSql(
name: "hotels-sql",
sqlConnectionString: Configuration["ConnectionStrings"],
tableOrViewName: "hotels");
hotelSource.DataChangeDetectionPolicy = new SqlIntegratedChangeTrackingPolicy();
DataSource roomSource = DataSource.AzureSql(
name: "rooms-sql",
sqlConnectionString: Configuration["ConnectionStrings"],
tableOrViewName: "rooms");
roomSource.DataChangeDetectionPolicy = new SqlIntegratedChangeTrackingPolicy();
我这样设置索引:
fields = new List<Field>
{
Field.New("Id", DataType.String, isKey: true),
Field.New("Name", DataType.String, isSearchable: true, isRetrievable: false, analyzerName: AnalyzerName.StandardLucene),
Field.New("Description", DataType.String, isSearchable: true, isRetrievable: false, analyzerName: AnalyzerName.StandardLucene),
Field.New("Category", DataType.String, isRetrievable: false, isFilterable: true),
new Field("Rooms", DataType.Collection(DataType.Complex), new List<Field>
{
Field.New("Name", DataType.String, isRetrievable: false, isSearchable: true, analyzerName: AnalyzerName.StandardLucene),
Field.New("Description", DataType.String, isRetrievable: false, isSearchable: true, analyzerName: AnalyzerName.StandardLucene),
Field.New("Category", DataType.String, isRetrievable: false, isFilterable: true)
})
};
var definition = new Index()
{
Name = indexName,
Fields = fields,
ScoringProfiles = new List<ScoringProfile>
{
new ScoringProfile("main", new TextWeights(new Dictionary<string, double>
{
{"Name", 1},
{"Description", 0.8},
{"Rooms/Name", 0.4},
{"Rooms/Description", 0.3}
}))
},
DefaultScoringProfile = "main"
};
Index index = searchService.Indexes.Create(definition);
我像这样设置映射:
Indexer hotelIndexer = new Indexer(
name: "hotels-indexer",
dataSourceName: hotelSource.Name,
targetIndexName: index.Name,
schedule: new IndexingSchedule(TimeSpan.FromMinutes(5)));
List<FieldMapping> map = new List<FieldMapping> {
new FieldMapping("HotelId", "Id")
};
Indexer roomIndexer = new Indexer(
name: "rooms-indexer",
dataSourceName: roomSource.Name,
targetIndexName: index.Name,
fieldMappings: map,
schedule: new IndexingSchedule(TimeSpan.FromMinutes(5)));
Rooms 表包含一列“HotelId”,它指向它所属的酒店的 ID。
结果应该是酒店索引中的房间列表由 roomIndexer 填充房间,但实际结果是房间与酒店一起被索引,就好像它们是酒店本身一样。房间列表仍然为空。
我希望我提供了足够的信息。
解决方案
Azure 搜索不支持附加到集合字段(Hotels 索引中的房间) - 似乎您已经对数据进行了建模,期望它这样做。
相反,您可以尝试将酒店中的所有房间扁平化为单个字段(可能是 Azure 搜索可以使用的字符串化 JSON 表示形式)。
推荐阅读
- java - 数据库访问和模型在内存中的存储
- python-3.x - 如何根据熊猫中的多个条件返回布尔系列?
- java - Kafka 配置未在 Spring Boot 中从 Spring 配置服务器加载
- javascript - 不读取手机上的 CSS 文件、JS 和图片
- django - Django Rest Framework - 序列化程序中带有查询参数的 URL
- python - 将文件下载到临时位置(例如在 RAM 中),以 http-request 中的 blob/编码格式返回,然后删除文件
- flutter - 在提供程序中更改值时显示 showDialog
- java - 如何使用 Apache camel 查看来自 sqs 队列的消息?
- flask - 如何在 Flask 中的 Python 编码中添加静态路径?
- python - 函数输出 None 而不是 Return