【发布时间】:2012-04-20 08:49:48
【问题描述】:
我正在尝试通过 Cassandra 中的列族进行部分搜索,类似于 SQL 查询,例如:SELECT * FROM columnfamily WHERE col = 'val*' 其中 val* 表示至少匹配前三个字符的任何值'瓦尔'。
我已经阅读了关于 SELECT 函数的datastax's documentation,但似乎找不到对部分 WHERE 标准的任何支持。有任何想法吗?
【问题讨论】:
我正在尝试通过 Cassandra 中的列族进行部分搜索,类似于 SQL 查询,例如:SELECT * FROM columnfamily WHERE col = 'val*' 其中 val* 表示至少匹配前三个字符的任何值'瓦尔'。
我已经阅读了关于 SELECT 函数的datastax's documentation,但似乎找不到对部分 WHERE 标准的任何支持。有任何想法吗?
【问题讨论】:
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;
这将为您提供“算盘”、“算盘”和“放弃”列。
使用此策略需要注意一些事项:
word:some_unique_value 的复合列。请记住,Cassandra 并没有为您提供一种简单的方法来进行临时查询。相反,您需要弄清楚您将如何使用数据并相应地为您的 CF 建模。请查看 Ed Anuff 在indexing data in Cassandra 上发布的这篇博文,了解有关此类数据建模的更多信息。
*请注意,在即将发布的 Cassandra 版本中,用于切片列的 CQL 语法会发生变化。
【讨论】: