gpt4 book ai didi

nosql - 使用 HBase 和/或 Cassandra 进行搜索(和一般查询)(最佳实践?)

转载 作者:可可西里 更新时间:2023-11-01 14:45:07 25 4
gpt4 key购买 nike

我有一个 User 模型对象,其中只有很少的字段(属性,如果你愿意的话)。说出“名字”、“姓氏”、“城市”和“出生年份”。每个用户还获得“唯一 ID”。

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

我的理解(几乎适用于任何键值存储——先是键,然后是值)

u:123456789 = serialized_json_object

(“u”作为用户 key 的简单前缀,123456789 是“唯一 ID”)。

现在,考虑到我希望能够按名字和姓氏进行搜索,我可以保存在:

f:Steve = u:384734807,u:2398248764,u:23276263f:Alex = u:12324355,u:121324334

所以关键是“f”——这是名字的前缀,而“Steve”是实际的名字。对于“u:Steve”,我们将所有属于“Steve”的用户 ID 保存为值。

这使得每次搜索都非常非常容易。通过几个字段(属性)查询——比如通过名字(即“Steve”)和姓氏(即“l:Anything”)仍然很容易——首先从“f:Steve”获取用户 ID 列表,然后从“l”获取用户 ID 列表:Anything”,查找交叉用户 ID,然后就可以了。

问题(而且有很多):

  1. 保存、更新、删除用户是一件痛苦的事情。它必须是原子的和一致的操作。此外,如果我们将值(value)的大小限制在某个值(value)之内——那么我们就有(潜在的)麻烦了。这里真的没有答案。只压缩用户 ID 列表?不过也不太酷。

  2. 我们要添加新字段以进行搜索的 ID。最终。以“城”说。我们当然可以用同样的方式 "c:Los Angeles"= ..., "c:Chicago"= ...,但是如果我们没有从一开始就预见到所有这些“搜索选择”,那么我们将有能够根据所有现有用户记录创建一些夜类工作或其他工作,并为他们更新那些“c:CITY”……这是一项艰巨的工作!

  3. 锁定问题。用户“u:123”更新他的名字“Alex”,用户“u:456”更新他的名字“Alex”。他们都必须用他们的 id 更新“f:Alex”。这意味着要么我们遇到覆盖问题,要么一个更新将等待另一个更新(如果有很多更新则进行成像?!)。

最好的方法是什么?请记住,我想按多个字段进行搜索?

附言拜托,问题是关于 HBase/Cassandra/NoSQL/Key-Value 存储。请拜托——没有使用 MySQL 和“阅读”SELECTs 的建议;并担心“以后”的扩展问题。我完全按照我的方式问我的问题是有原因的。 :-)

最佳答案

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

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

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

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

关于nosql - 使用 HBase 和/或 Cassandra 进行搜索(和一般查询)(最佳实践?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2619744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com