Indexing 使用Redis排序集进行索引
我想就我正在考虑的两种使用Redis排序集实现可搜索索引的方法获得一些反馈和建议 形势和目标 目前,我们在Cassandra中存储了一些键值表,我们希望为它们建立索引。例如,一个表将包含人的记录,Cassandra表将id作为主键,序列化对象作为值。对象将具有诸如first_name、last_name、last_updated等字段 我们想要的是能够进行诸如“姓氏='Smith'和名字>Joel'”、“姓氏<'Aaronson'”、“姓氏='Smith'和姓氏='Winston'”等搜索。搜索应该产生匹配的ID,这样我们就可以从Cassandra检索对象。我认为上面的搜索可以用一个索引完成,按姓氏、姓氏和姓氏进行字典排序。如果我们需要一些使用不同顺序的搜索(例如“first_name='Zeus'),我们可以有一个类似的索引来允许这些搜索(例如first_name,last_updated) 我们正在考虑使用Redis实现这一点,因为我们需要能够每分钟处理大量写操作。我阅读了一些常用的Redis排序集的使用方法,并提出了两种可能的实现: 选项1:每个索引的单个排序集 对于按姓氏、姓氏、姓氏更新的索引,我们在Redis中的关键索引下有一个排序集:people:last\u name:first\u name:last\u updated,其中包含格式为last\u name:first\u name:last\u updated:id的字符串。例如:Indexing 使用Redis排序集进行索引,indexing,nosql,redis,set,sorted,Indexing,Nosql,Redis,Set,Sorted,我想就我正在考虑的两种使用Redis排序集实现可搜索索引的方法获得一些反馈和建议 形势和目标 目前,我们在Cassandra中存储了一些键值表,我们希望为它们建立索引。例如,一个表将包含人的记录,Cassandra表将id作为主键,序列化对象作为值。对象将具有诸如first_name、last_name、last_updated等字段 我们想要的是能够进行诸如“姓氏='Smith'和名字>Joel'”、“姓氏
class Person(odm.StdModel):
first_name = odm.SymbolField()
last_name = odm.SymbolField()
last_update = odm.DateTimeField()
史密斯:乔尔:1372761839.444:0azbjZRHTQ6U8enBw6BJBw
(对于分隔符,我可能会使用“::”而不是“:”或其他更好地处理词典排序的东西,但现在让我们忽略它)
所有项目都将被给予0分,这样排序的集合将只按照字符串本身的字典顺序进行排序。如果我想执行类似“last_name='smith'和first_name<'bob'”的查询,我需要获取列表中位于'smith:bob'之前的所有项目
据我所知,这种方法有以下缺点:
SELECT WHERE first_name,例如'jon%'
,您将遇到麻烦。如果您想同时搜索两个字段,您还需要设计跨多个列的额外、非常大的索引。基本上,您需要不断地进行黑客攻击并重新设计搜索框架。您最好使用or或其他任何已经构建的框架来完成您正在尝试的工作。Redis非常棒,有很多很好的用途。这不是其中之一qs = models.person.filter(first_name='john', last_name='smith')
qs = models.person.filter(first_name=('john','carl'), last_name=('smith','wood'))
//define schema
redblade.schema('article', {
"_id" : "id"
, "poster" : "index('user_article')"
, "keywords" : "keywords('articlekeys', return +new Date() / 60000 | 0)"
, "title" : ""
, "content" : ""
})
//insert an article
redblade.insert('article', {
_id : '1234567890'
, poster : 'airjd'
, keywords : '信息技术,JavaScript,NoSQL'
, title : '测试用的SLIDE 标题'
, content : '测试用的SLIDE 内容'
}, function(err) {
})
//select by index field or keywords
redblade.select('article', { poster:'airjd' }, function(err, articles) {
console.log(articles[0])
})
redblade.select('article', { keywords: 'NoSQL' }, function(err, articles) {
console.log(articles[0])
})