【问题标题】:Cassandra (Pycassa/CQL) Return Partial MatchCassandra (Pycassa/CQL) 返回部分匹配
【发布时间】:2012-04-20 08:49:48
【问题描述】:

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

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

【问题讨论】:

    标签: cassandra cql pycassa


    【解决方案1】:

    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的东西,你需要有一些方法来区分它们(否则插入宽列族会破坏其他有效值)。一种方法是使用word:some_unique_value 的复合列。
    • 上述模型只允许字符串末尾的通配符。字符串开头的通配符也可以通过一些修改轻松处理。字符串中间的通配符将更具挑战性。

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

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

    【讨论】:

    • 谢谢!这正是我需要的:)
    • 你如何'将其非规范化为第二个列族'。 ?如果我有这样的钥匙:aardvark.abacus.abacuses,我想要任何以 *.abacuses 结尾的东西
    猜你喜欢
    • 1970-01-01
    • 2016-03-17
    • 2010-09-18
    • 1970-01-01
    • 2013-08-28
    • 2014-01-20
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多