2010-04-12 38 views
2

我有用户模型对象,其中包含很少的字段(属性,如果愿意)。说“名”,“姓”,“城市”和“出生年份”。每个用户也获得“唯一的ID”。使用HBase和/或Cassandra进行搜索(和一般查询)(最佳实践?)

我希望能够通过它们进行搜索。我如何正确地做到这一点?如何做到这一点?

我的理解(将用于几乎任何工作键值存储 - 首先进入键,然后值)

U:123456789 = serialized_json_object

(“U”作为一个简单的前缀为用户的密钥,123456789是“唯一ID”)。现在

,以为我希望能够通过名字和姓氏进行搜索,我可以节省:

F:史蒂夫= U:384734807,U:2398248764,U:23276263 F:亚历克斯= U :12324355,u:121324334

so key is“f” - 这是名字的前缀,“Steve”是实际的名字。 对于“u:Steve”,我们将所有用户标识的值都保存为“Steve's”。

这使得每个搜索都非常简单。通过名字(即“Steve”)和姓氏(即“l:Anything”)查询几个字段(属性)仍然很容易 - 首先从“f:Steve”获取用户id列表,然后从“l :任何事情“,找到穿越用户ID,一个你在这里。

问题(也有不少):

  1. 保存,更新,删除用户是一种痛苦。它必须是原子和一致的操作。另外,如果我们的价值大小限于某个价值 - 那么我们处于(潜在的)麻烦之中。这里真的没有答案。仅压缩用户标识列表?虽然不太酷。

  2. 什么我们要添加新的字段来搜索。最终。按“城市”说。我们当然可以用同样的方式“c:洛杉矶”= ...,“c:芝加哥”= ...,但如果我们从一开始就没有预见到所有这些“搜索选择”,那么我们将会有能够创造一些夜间工作或一些去所有现有的用户记录和更新这些“C:城市”为他们......很大的工作!

  3. 锁定问题。用户“u:123”更新他的名字“Alex”,用户“u:456”更新他的名字“Alex”。他们都必须用他们的身份证更新“f:Alex”。这意味着要么我们进入覆盖问题,要么一个更新会等待另一个更新(并且如果它们中有很多是成像?!)。

这样做的最好方法是什么?请记住,我想通过很多领域进行搜索?

P.S.请问,这个问题是关于HBase/Cassandra/NoSQL/Key-Value存储的。请请 - 没有建议使用MySQL和“阅读”选择;并担心“稍后”出现缩放问题。我之所以会问我这个问题,是有原因的。 :-)

回答

4

能够直接查询属性是离开SQL时丢失的功能之一,因此您需要一种方法来维护您自己的索引以使您找到记录。

如果您的数据存储没有内置索引或原子列表操作,则需要处理您提到的锁定问题。然而,索引不一定需要同步 - 维护一个更新记录的队列被重新编制索引,并且你有3个解决方案可以重用来解决2。

如果特定值的索引列表变得太大而系统无法在单个列表中处理,则可以用列表列表替换用户列表。但是,如果具有相同值的多条记录,则它可能不是特别有用的搜索条件。

在某些情况下另一个有用的选择是使用一个单独的系统进行索引 - 例如,您可以设置lucene来索引主数据存储区中的记录。

+0

您能否提出实现Cassandra/HBase的描述功能的最佳方法?我的“自己”方式只是我的猜测,我想知道的是,这里的最佳做法是什么。 – alexeypro 2010-04-12 15:16:07

+0

所有这些都对真实的最佳实践来说有点新,但是您描述的方法与标准相当接近。您需要的主要改进是使用您选择的平台为列表提供的任何支持,以便您可以添加项目而无需加载整个列表。有了Cassandra,你可能会使用超级列。如果您有像memcached这样的纯键 - 值存储,则可以将列表实现为值,但是您还需要实现锁和可能的队列。 – 2010-04-13 07:05:30

1

我想我会实现这个作为MapReduce作业,这将按计划运行。 每个搜索词将是一个查找UID的行键。

Rowkey:UID1
简介:名字:乔
简介:名字:李四
简介:尼克:DoeMaster

Rowkey:UID2
简介:姓:简
简介:名字:Doe
简介:昵称:SuperBabe

MapReduse索引的所有搜索特性和与搜索词添加它们作为行键

Rowkey:简
查找:UID:UID2

Rowkey:李四
查找:UID :uid2,uid1

Rowkey:DoeMaster
查找:UID:由UID1

...等

现在,如果你需要即时更新的用户更改索引列表,你可以直接写换到索引库,从索引中删除uid值并添加到另一个行键。在发生这种情况的同时,可以实施临时锁定。

对于被删除的用户,可以使用告知用户状态的附加属性将其从搜索中滤除。

添加额外的搜索词不是很难,因为它只是关于您想索引的名称:值。您还可以通过向行键/关键字添加type属性来过滤搜索。即波士顿 - 查找:类型:城市。

这个想法是维护你自己的基于行键的搜索索引在hbase中。