我正在尝试通过 Cassandra 中的列族进行部分搜索,类似于 SQL 查询,例如:SELECT * FROM columnfamily WHERE col = 'val*' 其中 val* 表示至少匹配前三个字符 'val' 的任何值。
我已经阅读了有关 SELECT 函数的 datastax 文档,但似乎找不到对部分 WHERE 标准的任何支持。有任何想法吗?
我正在尝试通过 Cassandra 中的列族进行部分搜索,类似于 SQL 查询,例如:SELECT * FROM columnfamily WHERE col = 'val*' 其中 val* 表示至少匹配前三个字符 'val' 的任何值。
我已经阅读了有关 SELECT 函数的 datastax 文档,但似乎找不到对部分 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 的这篇关于在 Cassandra 中索引数据的博客文章,了解有关此类数据建模的更多信息。
*请注意,用于切片列的 CQL 语法在即将发布的 Cassandra 中发生了变化。