我刚刚开始为多租户 Web 应用程序设计ElasticSearch映射。在这个应用程序中,有站点 ID:s 和页面 ID:s。页面 ID:每个站点都是唯一的,并且是随机生成的。页面可以有子页面。
什么是最好的:
1)使用带有站点+页面ID的复合键:s?像这样:
"sitePageIdPath": "(siteID):(grandparent-page-ID).(parent-page-ID).(page-ID)"
或者:
2) 对站点 ID 和页面 ID 使用单独的字段?像这样:
"siteId": "(siteID)",
"pageIdPath": "(grandparent-page-ID).(parent-page-ID).(page-ID)"
?
我在想,如果我将站点 ID 和页面 ID 合并到一个字段中,那么 ElasticSearch 将只需要处理该字段,这应该比使用两个字段更高效——无论是在索引时还是在搜索时?并且需要更少的存储空间。
但是,也许有一些我不知道的缺点?因此这个问题。
一些细节:1)我正在使用单个索引,并且我过度分配分片(100 个分片),正如使用“用户”数据流模式时所建议的那样。2) 我在 URL (ie &routing=site-ID
) 中明确指定路由参数,而不是通过索引文档中的任何siteId字段。
7小时后更新:
1)所有查询都应按站点ID(即租户ID)过滤。如果我确实将站点 ID 与页面 ID 结合起来,我想/希望我可以使用前缀过滤器来过滤站点 ID。我想知道这是否会像在单个专用siteId字段上进行过滤一样快(例如,可以缓存结果)。
2) 示例查询:全文搜索。列出所有用户。列出所有页面。列出某个页面的所有子/后续页面。加载单个页面(通过_source)。
22小时后更新:
3)我可以按页面 ID 搜索,因为作为 ElasticSearch 的_id
,我存储:(site-ID):(page-ID)
。因此,页面 ID 作为pageIdPath的最后一个元素“隐藏”不是问题。我之前可能应该提到我有一个单独的页面 ID 字段,但我认为让我们保持简短的问题。
4)我index: not_analyzed
用于这些 ID 字段。