Cassandra(Pycassa/CQL)返回部分匹配

Har*_*Ali 4 cql cassandra pycassa

我正在尝试通过Cassandra中的列族进行部分搜索,类似于SQL查询,例如:SELECT*FROM columnfamily WHERE col ='val*'其中val*表示至少匹配前三个字符'val'的任何值.

我已阅读有关SELECT函数的datastax文档,但似乎无法找到对部分WHERE条件的任何支持.有任何想法吗?

psa*_*ord 9

在Cassandra中没有这样的通配符支持,但是您可以通过这样的方式对数据建模,以便获得相同的最终结果.

您将获取要执行此查询的列,并将其非规范化为第二列族.此CF将有一个宽行,列名称为col您要进行通配符查询的值.此CF的列值可以是原始CF的行键,也可以是原始行的其他表示形式.

然后你会使用切片来获得你关心的值.例如,如果这是要切片的宽行:

 +---------+----------+--------+----------+---------+--------+----------+
 |  RowKey | aardvark | abacus | abacuses | abandon | accent | accident |
 |         +----------+--------+----------+---------+--------+----------+
 |         |          |        |          |         |        |          |
 |         |          |        |          |         |        |          |
 +---------+----------+-----------------------------+--------+----------+
Run Code Online (Sandbox Code Playgroud)

使用CQL,您可以使用此查询*选择以'aba*'开头的所有内容:

  SELECT 'aba'..'abb' from some_cf where RowKey = some_row_key;
Run Code Online (Sandbox Code Playgroud)

这将为您提供"算盘","算盘"和"放弃"的列.

这个策略有一些需要注意的事项:

  • 在上面的示例中,如果您拥有相同column_name的东西,则需要有一些方法来区分它们(否则插入宽列族将破坏其他有效值).您可以通过使用以下复合列来实现此目的的一种方法word:some_unique_value.
  • 上述模型仅允许字符串末尾的通配符.字符串开头的通配符也可以通过一些修改轻松处理.字符串中间的外卡会更具挑战性.

请记住,Cassandra并没有为您提供简单的方法来进行即席查询.相反,您需要弄清楚如何使用数据并相应地为CF建模.看一下Ed Anuff关于Cassandra索引数据的博客文章,了解有关建模数据的更多信息.

*请注意,即将发布的Cassandra版本中切片列的CQL语法正在发生变化.