4

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

我已经阅读了有关 SELECT 函数的 datastax 文档,但似乎找不到对部分 WHERE 标准的任何支持。有任何想法吗?

4

1 回答 1

10

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 的这篇关于在 Cassandra 中索引数据的博客文章,了解有关此类数据建模的更多信息。

*请注意,用于切片列的 CQL 语法在即将发布的 Cassandra 中发生了变化。

于 2012-04-07T16:56:18.043 回答