搜索的结构排序

问题描述

我正在寻找一种实现搜索结构排序的方法。我使用 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","folders": []
    }
]

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

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

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

最初的想法是在将可搜索对象放入 Azure 搜索之前计算某个文件夹索引。例如文件夹索引:

[
    {
        "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

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

使用关系结构会更容易,我可以将文件夹及其索引与可搜索对象分开存储,按文件夹 ID 连接它们并按文件夹索引器排序,但...

有没有办法做到这一点?

解决方法

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

例如:

文档 1:“字段 1”

文档 2:“字段 1”

文档 3:“field1\subfield11\subfield111”

文档 4:“字段 2”