首页 > 解决方案 > 搜索的结构排序

问题描述

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

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

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

[
    {
        "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 搜索之前计算某个文件夹索引。例如文件夹索引:

[
    {
        "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 连接它们,并按文件夹索引器排序,但是......

有没有办法做到这一点?

标签: azuresearchluceneazure-cognitive-searchazure-search-.net-sdk

解决方案


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

例如:

Doc1:“字段1”</p>

Doc2:“字段1”</p>

Doc3:“field1\subfield11\subfield111”</p>

Doc4:“字段2”</p>


推荐阅读