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

时间:2012-04-06 19:48:46

标签: cassandra cql pycassa

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

我在SELECT函数上读过datastax's documentation,但似乎找不到对部分WHERE标准的任何支持。有任何想法吗?

1 个答案:

答案 0 :(得分:9)

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

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

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

 +---------+----------+--------+----------+---------+--------+----------+
 |  RowKey | aardvark | abacus | abacuses | abandon | accent | accident |
 |         +----------+--------+----------+---------+--------+----------+
 |         |          |        |          |         |        |          |
 |         |          |        |          |         |        |          |
 +---------+----------+-----------------------------+--------+----------+

使用CQL,您可以使用此查询*:

选择以'aba *'开头的所有内容
  SELECT 'aba'..'abb' from some_cf where RowKey = some_row_key;

这会为您提供“算盘”,“算盘”和“放弃”的列。

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

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

请记住,Cassandra并没有为您提供简单的方法来进行即席查询。相反,您需要弄清楚如何使用数据并相应地为CF建模。有关如此建模数据的更多信息,请查看Ed Anuff在indexing data in Cassandra上发布的这篇博客文章。

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