我想获得有关我正在考虑使用Redis排序集实现可搜索索引的两种方法的一些反馈和建议。
情况和客观
当前,我们有一些键值表要存储在Cassandra中,我们希望为其提供索引。例如,一个表将包含人员记录,而Cassandra表将以id作为其主键,并以序列化的对象作为值。该对象将具有诸如first_name,last_name,last_updated等字段。
我们想要的是能够进行搜索,例如“last_name ='Smith'AND first_name>'Joel'“,” last_name <'Aaronson'“,” last_name ='Smith'和first_name ='Winston'“等。搜索应产生匹配的ID,这样我们就可以从Cassandra中检索对象。我在想以上搜索可以用单个索引完成,按last_name,first_name和last_updated的字典顺序排序。如果我们需要使用不同的顺序进行搜索(例如“first_name ='Zeus'”),我们可以使用类似的索引来允许这些搜索(例如first_name,last_updated)。
我们正在考虑将Redis用于此目的,因为我们需要能够每分钟处理大量写入。我已经阅读了使用Redis排序集的一些常见方式,并提出了两种可能的实现方式:
选项1:每个索引一个单独的排序集
对于按last_name,first_name,last_updated进行索引的索引,我们将在Redis中的键index:people:last_name:first_name:last_updated下设置一个排序集,其中包含格式为last_name:first_name:last_updated:id的字符串。例如:
史密斯:joel:1372761839.444:0azbjZRHTQ6U8enBw6BJBw
(对于分隔符,我可以使用'::'而不是':'或其他可以更好地按字典顺序使用的方法,但现在暂时忽略它)
所有项目的评分都为0,因此排序后的集合将仅按字符串本身的字典顺序进行排序。然后,如果我想执行“last_name ='smith'AND first_name <'bob'”之类的查询,则需要获取列表中'smith:bob'之前的所有项目。
据我所知,这种方法存在以下缺点:
选项2:小型排序集,按last_updated 排序
这种方法将是相似的,不同的是我们将有许多较小的排序集,每个集合都有类似时间的值,例如分数的last_updated。例如,对于相同的last_name,first_name,last_updated索引,我们将为每个last_name,first_name组合设置一个排序集。例如,键可能是index:people:last_name = smith:first_name = joel,并且对于我们称为Joel Smith的每个人都有一个条目。每个条目将以id作为其名称,并将last_updated值作为其分数。例如。:
值:0azbjZRHTQ6U8enBw6BJBw;得分:1372761839.444
这样做的主要优点是:(a)我们知道除last_updated之外的所有字段都非常容易,并且(b)使用ZREMRANGEBYSCORE实现生存时间将非常容易。
缺点对我来说似乎很大:
打包
因此,在我看来,尽管有缺点,第一种选择还是会更好。非常感谢您对这两个或其他可能的解决方案的反馈(即使它们是我们应该使用Redis以外的其他方式)。
最佳答案
SELECT WHERE first_name LIKE 'jon%'
,您将遇到麻烦。如果您想同时搜索两个字段,则还需要设计跨多个列的额外的非常大的索引。从本质上讲,您将需要继续努力并重新设计搜索框架。您最好使用Elastic Search或Solr,或者已经建立用于执行您要执行的操作的任何其他框架。 Redis很棒,并且有很多很好的用途。这不是其中的一个。 ZRANGEBYSCORE
),而无需重写它们。 Redis的功能非常非常理想地编写,因此最好在可能的情况下使用它们而不是编写自己的函数。 关于indexing - 使用Redis排序集建立索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17431719/