首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cassandra (Pycassa/CQL)返回部分匹配

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

Stack Overflow用户
提问于 2012-04-07 03:48:46
回答 1查看 5.2K关注 0票数 4

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

我已经阅读了SELECT函数上的datastax's documentation,但似乎找不到任何对部分WHERE条件的支持。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-08 00:56:18

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

您将获取要对其执行此查询的列,并将其反规范化到第二个列族中。此CF将有一个单独的宽行,其中列名作为要在其上执行通配符查询的col的值。此CF的列值可以是原始CF的行键,也可以是原始行的某些其他表示。

然后,您将使用切片来获取您所关心的值。例如,如果这是要切片的宽行:

代码语言:javascript
复制
 +---------+----------+--------+----------+---------+--------+----------+
 |  RowKey | aardvark | abacus | abacuses | abandon | accent | accident |
 |         +----------+--------+----------+---------+--------+----------+
 |         |          |        |          |         |        |          |
 |         |          |        |          |         |        |          |
 +---------+----------+-----------------------------+--------+----------+

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

代码语言:javascript
复制
  SELECT 'aba'..'abb' from some_cf where RowKey = some_row_key;

这将为您提供“算盘”、“算盘”和“放弃”列。

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

  • 在上面的例子中,如果你有相同column_name的东西,你需要有一些方法来区分它们(否则插入到宽列族中会影响到其他有效的值)。可以这样做的一种方法是使用上述模型的wordsome_unique_value.
  • The的复合列,只允许在字符串的末尾使用通配符。字符串开头的通配符也可以通过一些修改轻松处理。字符串中间的通配符将更具挑战性。

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

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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10048506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档