【问题标题】:Case agnostic lexicographical ordering in redis sorted setredis排序集中与大小写无关的词典排序
【发布时间】:2017-02-04 03:46:09
【问题描述】:

我有一个很大的字符串列表(包含用户名,大约 35 万条记录)。我需要按字典顺序存储它,并且应该能够有效地检索成员存在*和成员相似度**。 Redis 排序集看起来像作业的数据类型。

但是,我似乎在第一个障碍中跌倒了。具体来说,我的一个关键要求是将不同的字母大小写放在一起,只要它们以相同的字母开头。例如。 Benderbender 最终都应该并排订购。但是,redis 的排序集严格遵循字典排序规则,因此所有以大写开头的字符串默认排在所有以小写开头的字符串之前(例如,Za 之前排序,但在A 之后排序)。

有什么办法可以解决这个问题,并且仍然使用 redis 排序集来满足我的要求吗?仅供参考,我使用的是 redis 2.8.4 版。提前致谢。


*成员存在:给定一个用户名,检查存储集中是否已经存在

**成员相似度:给定一个用户名,拉出 N 个存储的与给定用户名最相似的用户名

【问题讨论】:

标签: sorting redis sortedset lexicographic


【解决方案1】:

您需要对名称进行一些特殊编码。下面是一个例子。

假设所有名称的长度都小于 100 个字符。对于每个名称,请执行以下步骤对其进行编码:

  1. 用2位数字记录大写字母的索引:对于BeNd,索引为0002
  2. 将名称的大写字母转换为小写字母以获得小写名称:从BeNdbend
  3. 将索引附加到小写名称以获得encoded name:从bendbend0002
  4. encoded name 添加到排序集中:zadd key 0 bend0002

这样,BeNdbend 应该并排排列。

当您要进行搜索时,使用相同的编码方法对给定名称进行编码、进行搜索并解码结果。由于encoded name记录的是大写字母的索引,所以可以轻松解码。

【讨论】:

  • 聪明。如果用户名字符串包含尾随 0 会发生什么,例如例如,想象一个用户名Bender12300
  • @HassanBaig 使用任何用户名中都不存在的特殊字符作为小写名称和索引之间的分隔符。例如:使用-作为分隔符,将Bender12300编码为bender12300-00
  • @for_stack :上述解决方案是否也适用于不区分大小写的搜索?
  • @RameshPapaganti 如果您只想进行不区分大小写的搜索,请参阅this 以获得解决方案
猜你喜欢
  • 2013-06-20
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多