【问题标题】:Cassandra: How to check if a column value is already presentCassandra:如何检查列值是否已经存在
【发布时间】:2014-03-22 03:31:23
【问题描述】:

我正在使用 Cassandra。有一列 name-text 存储所有说的用户名。

name
------
bob
Bob
bobby
mike
michael
micky
BOB

我有两个问题

  1. 我必须选择所有以“bo”开头的用户名。我知道在 Cassandra 中没有类似的等价物。但是有没有办法做到这一点? (附加列是一个选项,但还有其他内容吗?)
  2. 有 3 个条目。鲍勃,鲍勃和鲍勃。如果我通过 where name='bob',无论如何都可以使用获取所有 3 行。我需要获取不区分大小写的名称。

提前致谢。

【问题讨论】:

  • “但是有没有办法做到这一点”:有几个,各种复杂的。

标签: cassandra cql cql3


【解决方案1】:

让我们先从第二个问题开始。如果要支持不区分大小写的查询,则应将要搜索的文本数据的第二个大写副本存储在另一列中。然后通过按该列查询,您将能够执行不区分大小写的请求。

返回搜索bo*。最好的方法是使用允许您利用集群列(主键的第 2 列和更高列)进行范围搜索的模式。这是一个例子:

CREATE TABLE t1 (region INT, name TEXT, PRIMARY KEY (region, name)); 

特别是,如果您将name 设置为键的第二列,您将能够执行诸如

之类的搜索
SELECT * FROM t1 WHERE name >= 'bo' and name < 'bp' ALLOW FILTERING;

这将返回您正在寻找的结果。这仅适用于尾随通配符:前导字符必须保持不变才能使范围查询起作用。同样,如果要进行不区分大小写的搜索,请将不区分大小写的列作为主键的第二部分并通过它进行查询:

SELECT * FROM t1 WHERE name_upper >= 'BO' and name_upper < 'BP' ALLOW FILTERING;

【讨论】:

  • 而“允许过滤”通常意味着“我的架构错误”:)
  • 还不错;你能为这个用例推荐一个更好的架构吗?
  • 您可以让分区键成为目标列的第一个字母,但是如果您尝试跨字母的范围查询可能会有些尴尬。另一方面,这无论如何都不是问题的一部分,所以这可能是可以接受的。
  • 顺便说一句,我认为“纯” Cassandra 根本不适合用例,但 Solr + Cassandra 应该可以工作
猜你喜欢
  • 2012-05-13
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 2019-08-21
  • 2019-03-19
相关资源
最近更新 更多