首页 > 解决方案 > 在来自 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与特定模式匹配的孩子的父事物。

约束

我们有各种限制:

  1. 我们必须使用 SQL API 将数据存储在 Cosmos 中。
  2. 我们只能使用 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 搜索。但是,这将需要不受支持的跨文档连接。

其他选择

我看到的其他建议是:

问题

是否可以使用 Cosmos (SQL-API) 和 Azure 搜索来满足此要求,如果可以,如何?

标签: azureazure-cosmosdbazure-cognitive-searchazure-cosmosdb-sqlapi

解决方案


为什么不将所有子项作为单独的文档存储到 Azure 搜索中,然后只需添加另一个包含所需父信息的属性:

{
            "id": "1_a",
            "name": "child_1_a"
            ... other child fields ...,
            "parent": {
                 "parentId":123,
                 "parentName":"x"
                  ... other parent fields ...,
            }    
}

您的查询也应该简化(在我看来)。


推荐阅读