azure - 在来自 Cosmos 的无限子对象数组中进行 Azure 搜索
问题描述
要求
我有一个数据模型,其中每个“事物”都有许多孩子,可以用 JSON 表示,如下所示。
{
"id": "1",
"name": "parent_1",
... other parent fields ...
"children": [
{
"id": "1_a",
"name": "child_1_a"
... other child fields ...
},
{
"id": "1_b",
"name": "child_1_b"
... other child fields ...
}
]
}
要求是我们找到所有包含name
与特定模式匹配的孩子的父事物。
约束
我们有各种限制:
- 我们必须使用 SQL API 将数据存储在 Cosmos 中。
- 我们只能使用 Azure 搜索。
问题
理想情况下,我们会将每个父“事物”作为整个文档及其所有子存储在 Cosmos 中。但是,可能会有很多子级,这意味着文档大小有时会超过 Cosmos 文档的 2MB 限制。
我尝试过的事情
尝试 1
另一种方法是将单独的父文档和子文档存储在同一个 Azure Cosmos 集合中,使用字段区分父文档和子文档,并使用type
字段引用父文档id
。例如
家长
{
"id": "1",
"name": "parent_1",
"type": "parent"
}
孩子 1
{
"id": "1_a",
"name": "child_1_a",
"type": "child",
"parentId": "1"
}
孩子 2
{
"id": "1_b",
"name": "child_1_b",
"type": "child",
"parentId": "1"
}
但是,然后搜索子名称可以带回同一父级的许多页面结果,因此仅获取少数父级可能需要带回 1000 页匹配的子级,从性能角度来看,这并不理想。
尝试 2
我想我可以在 Cosoms 中使用 JOIN 来填充 Azure 搜索。但是,这将需要不受支持的跨文档连接。
其他选择
我看到的其他建议是:
父母身份的方面,但我读过这会表现得很糟糕。
将孩子分批(例如 500 个孩子)并将每个批次附加到父级。如果单个父级有多个批次,则对父级的字段进行非规范化。这是目前唯一适用于当前数据的选项,尽管它似乎只是延迟了问题 - 例如,在某些时候,批次的数量可能会变得足够大以再次降低搜索性能。
问题
是否可以使用 Cosmos (SQL-API) 和 Azure 搜索来满足此要求,如果可以,如何?
解决方案
为什么不将所有子项作为单独的文档存储到 Azure 搜索中,然后只需添加另一个包含所需父信息的属性:
{
"id": "1_a",
"name": "child_1_a"
... other child fields ...,
"parent": {
"parentId":123,
"parentName":"x"
... other parent fields ...,
}
}
您的查询也应该简化(在我看来)。
推荐阅读
- c# - 代码合同机制是否已经死亡并且没有未来?
- php - 如何获取每日记录和总结
- android - 如何从 Android API 24+ 在 SD 卡上写入文件
- ios - BezierPath 确实不在屏幕上
- sql-server - PowerShell中的SQL Server查询,根据日期限制我的结果
- node.js - 将错误消息从猫鼬验证转换为用户友好的消息
- snowflake-cloud-data-platform - 如何使用 talend 在 snwoflake 表上执行 SCD 1
- java - GeoTools:将自定义多边形插入现有的 .shp 文件
- javascript - 使用 Selenium/Puppeteer 优化高速浏览器交互
- python - 样条与python scipy中的平面相交