azure - 搜索的结构排序
问题描述
我正在寻找一种方法来实现搜索的结构排序。我使用 Azure 搜索并有索引(简化):
[
{
"id": Guid,
"name": string,
"folderId": Guid
}
]
name
field 是我正在执行搜索查询的字段。还有文件夹 - 显然,对象所在的文件夹。假设我有一个文件夹结构:
[
{
"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 连接它们,并按文件夹索引器排序,但是......
有没有办法做到这一点?
解决方案
保留文件夹索引是否只是为了按文件夹路径对结果集进行排序?如果是这种情况,为什么不将完整文件夹路径作为可排序字段保留在原始索引中?这样,您就可以按文件夹路径对结果集进行排序,假设您想要的文件夹路径顺序是字母顺序。
例如:
Doc1:“字段1”</p>
Doc2:“字段1”</p>
Doc3:“field1\subfield11\subfield111”</p>
Doc4:“字段2”</p>
推荐阅读
- getstream-io - 访问 Stream 的提要数据库
- encryption - 如何获取创建的机器级 RSA 密钥容器的 PublicKeyToken 以在 Web.config 的“configProtectedData”元素中使用?
- javascript - 如何定位元素顶部的容器?
- replace - 以编程方式更改 aepx 文件中的文本
- javascript - js中本地时间变量的实例
- c# - 为什么 UtcDateTime 函数没有将偏移量添加到 UTC 日期?
- php - 为什么 Laravel 邮件队列中的收件人会堆积起来?
- javascript - 如何使用ajax来使用post并找到它的url
- ios - 从 Swift 中的 firebase 获取时间戳
- jquery - 根据 if 条件在 $.ajax 中传递多个数据