在 RediSearch 中使用动态索引有意义吗?
Does it make sense to have dynamic indexes in RediSearch?
例如:考虑一个散列(我们称之为事件)有两个可搜索的属性:user_id(数字)和名称(文本)。
但是,每当我需要按名称过滤事件时,我手头都有 user_id。
所以我想知道为每个用户设置一个事件索引而不是为所有用户设置一个大事件索引是否有意义。
根据我对 Redis 和 RediSearch 的基本了解:
- 所有用户所有事件的一个索引:
- 前缀:“事件:”
- 关键示例:events:123、events:456
- 优点:更容易。
- 缺点:每当我需要搜索名称为“foo”的事件时,user_id 100 RediSearch 需要使用 user_id 查找事件块,然后过滤名称。哈希需要在同一个分片中或使用协调器。
- 每个用户为其事件创建一个索引:
- 前缀:“events:%USER_ID%:”,即“events:789”,其中 789 是用户 ID
- 关键示例:events:789:123
- 优点:较小的索引可以获得更好的性能并且可以轻松分发。
- 缺点:更难维护。 如果有 1mi 个用户,我们有 1mi 个索引,不知道这是不是问题。
@jonathan 这取决于您的性能要求和可用内存。
如果内存不是问题(两次索引同一个文档)并且您希望将延迟降至最低,那么这听起来像是一个可选选项。
创建如此多的索引会对 GC 产生开销,因此您应该仅在用户级索引相当静态或短暂时才考虑它,您可以将其定义为 TEMPORARY
(可以与无限超时)
例如:考虑一个散列(我们称之为事件)有两个可搜索的属性:user_id(数字)和名称(文本)。
但是,每当我需要按名称过滤事件时,我手头都有 user_id。 所以我想知道为每个用户设置一个事件索引而不是为所有用户设置一个大事件索引是否有意义。
根据我对 Redis 和 RediSearch 的基本了解:
- 所有用户所有事件的一个索引:
- 前缀:“事件:”
- 关键示例:events:123、events:456
- 优点:更容易。
- 缺点:每当我需要搜索名称为“foo”的事件时,user_id 100 RediSearch 需要使用 user_id 查找事件块,然后过滤名称。哈希需要在同一个分片中或使用协调器。
- 每个用户为其事件创建一个索引:
- 前缀:“events:%USER_ID%:”,即“events:789”,其中 789 是用户 ID
- 关键示例:events:789:123
- 优点:较小的索引可以获得更好的性能并且可以轻松分发。
- 缺点:更难维护。 如果有 1mi 个用户,我们有 1mi 个索引,不知道这是不是问题。
@jonathan 这取决于您的性能要求和可用内存。
如果内存不是问题(两次索引同一个文档)并且您希望将延迟降至最低,那么这听起来像是一个可选选项。
创建如此多的索引会对 GC 产生开销,因此您应该仅在用户级索引相当静态或短暂时才考虑它,您可以将其定义为 TEMPORARY
(可以与无限超时)