搜索的结构排序

Structural ordering for search

我正在寻找一种方法来实现搜索的结构排序。我使用 Azure 搜索并有索引(简化):

[
    {
        "id": Guid,
        "name": string,
        "folderId": Guid
    }
]

name 字段是我正在执行搜索查询的字段。还有文件夹——显然,对象所在的文件夹。 假设我有一个文件夹结构:

[
    {
        "id": "a595885e-520e-4fd2-9bdd-3f494f187b2e",
        "name": "folder1"
        "searchObjects": [],
        "folders": [
            {
                "id": "f760f2bd-7291-49ed-9be2-9546ce57fb87",
                "name": "subfolder1",
                "searchObjects": [],
                "folders": []
            }
        ]
    },
    {
        "id": "200ff3b6-310a-49d1-ad99-aed6f34a8f38",
        "name": "folder2",
        "searchObjects": [],
        "folders": []
    }
]

并且每个文件夹都有 3000 个可搜索对象。 我想要实现的是我想对搜索结果进行分页并根据文件夹结构检索这些页面。例如,假设我在每个请求中查询 5000 个对象。在这种情况下,我会得到:

1 页 - 文件夹 1 中的 3000 个项目 + 子文件夹 1 中的 2000 个项目;

2 页 - 子文件夹 1 中的 1000 项 + 文件夹 2 中的 3000 项;

最初的想法是计算某个文件夹索引,然后将可搜索对象放入Azure Search。例如文件夹索引:

[
    {
        "index": 1
        "name": "folder1"
        "folders": [
            {
                "index": 11,
                "name": "subfolder1"
            },
            {
                "index": 12,
                "name": "subfolder2"
            },
            {
                "index": 13,
                "name": "subfolder3"
                "folders": [
                    {
                        "index": 131,
                        "name": "subSubfolder1"
                    }
                ]
            }
        ]
    },
    {
        "index": 2
        "name": "folder2"
        "folders": [
            {
                "index": 21,
                "name": "subfolder2"
            }
        ]
    }
]

可搜索对象:

[
    {
        "id": "3d4374ec-18a0-4e5b-bb55-e7576b475cdb",
        "name": "this object is in folder1",
        "folderIndex": 1
    },
    {
        "id": "3d4374ec-18a0-4e5b-bb55-e7576b475cdb",
        "name": "this object is in subSubfolder1",
        "folderIndex": 131
    },
    {
        "id": "2c2c02ec-3f57-4c85-886e-df6603718d44",
        "name": "this object is in subfolder1",
        "folderIndex": 11
    },
    ...
]

这将允许我按名称搜索并按文件夹结构排序:

search=this object&$top=5000&$searchFields=name&$orderby=folderIndex,name

当我 put/change 一个文件夹中的一个甚至一千个对象时它工作正常,我只是 index/reindex Azure 搜索端的这些对象。但它在规模上不起作用。我可能有数百个文件夹相互折叠,每个文件夹可能包含数千个对象。因此,如果我重新组织文件夹,它就会变得一团糟。我必须重新计算几乎所有对象,从更改树中的顶部文件夹开始一直到底部叶子。

如果使用关系结构,我可以将文件夹及其索引与可搜索对象分开存储,按文件夹 ID 加入它们并按文件夹索引器排序,但是 ...

有没有办法做到这一点?

保留文件夹索引只是为了按文件夹路径对结果集进行排序吗?如果是这样,为什么不将完整的文件夹路径保留为原始索引中的可排序字段?这样您就可以按文件夹路径对结果集进行排序,假设您想要的文件夹路径顺序是按字母顺序排列的。

例如:

文档 1:“字段 1”

文档 2:“字段 1”

文档 3:“field1\subfield11\subfield111”

文档 4:“字段 2”