Cassandra 卡桑德拉:如何检查列值是否已经存在

Cassandra 卡桑德拉:如何检查列值是否已经存在,cassandra,cql,cql3,Cassandra,Cql,Cql3,我用的是卡桑德拉。有一个列名文本,它存储了所有的用户名 name ------ bob Bob bobby mike michael micky BOB 我有两个问题 我必须选择所有以“bo”开头的用户名。我知道卡桑德拉没有类似的例子。但究竟有没有办法做到这一点?(附加列是一个选项,但是否还有其他选项?) 共有3个条目。鲍勃,鲍勃和鲍勃。如果我传递where name='bob',是否仍要使用fetch所有3行。我需要取不区分大小写的名字 提前谢谢。让我们先从第二个问题开始。如果希望支持不区分

我用的是卡桑德拉。有一个列名文本,它存储了所有的用户名

name
------
bob
Bob
bobby
mike
michael
micky
BOB
我有两个问题


  • 我必须选择所有以“bo”开头的用户名。我知道卡桑德拉没有类似的例子。但究竟有没有办法做到这一点?(附加列是一个选项,但是否还有其他选项?)
  • 共有3个条目。鲍勃,鲍勃和鲍勃。如果我传递where name='bob',是否仍要使用fetch所有3行。我需要取不区分大小写的名字

  • 提前谢谢。

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

    返回搜索
    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;
    
    从t1中选择*,其中name>='bo'和name<'bp'允许过滤;
    
    这将返回您要查找的结果。这仅适用于尾随通配符:前导字符必须是常量,范围查询才能工作。同样,如果要执行不区分大小写的搜索,请将不区分大小写的列作为主键的第二部分并按其进行查询:

    SELECT * FROM t1 WHERE name_upper >= 'BO' and name_upper < 'BP' ALLOW FILTERING;
    
    从t1中选择*,其中name_upper>='BO'和name_upper<'BP'允许过滤;
    
    “但无论如何都有办法做到这一点”:有几种,各种各样的复杂性。“允许过滤”通常意味着“我的模式是错误的”:)足够公平;您能为这个用例推荐一个更好的模式吗?您可以让分区键成为目标列的第一个字母,但是如果您尝试跨字母的范围查询,可能会有点尴尬。另一方面,这不是问题的一部分,所以这可能是可以接受的。顺便说一句,我认为“纯”Cassandra根本不适合这个用例,但是Solr+Cassandra应该可以工作