Nosql 如何过滤Cassandra中的数据?

Nosql 如何过滤Cassandra中的数据?,nosql,cassandra,Nosql,Cassandra,我在应用程序中使用mySQL已经有一段时间了,我收集的数据越多,速度就越慢。所以我一直在研究NOSQL选项。我在mySQL中拥有的一个功能是从一组连接创建一个视图。该应用程序显示网格中的所有重要信息,用户可以在此数据集上选择范围、进行搜索等。标准查询内容 看看Cassandra,一切都已经根据我在storage-conf.xml中提供的参数进行了排序。所以我在超级列中有一个特定的字符串作为我的键,并在下面的列中保留一组数据。但我只能按一列进行排序,如果不拉动所有超级列并循环数据,我无法在列中进行

我在应用程序中使用mySQL已经有一段时间了,我收集的数据越多,速度就越慢。所以我一直在研究NOSQL选项。我在mySQL中拥有的一个功能是从一组连接创建一个视图。该应用程序显示网格中的所有重要信息,用户可以在此数据集上选择范围、进行搜索等。标准查询内容

看看Cassandra,一切都已经根据我在storage-conf.xml中提供的参数进行了排序。所以我在超级列中有一个特定的字符串作为我的键,并在下面的列中保留一组数据。但我只能按一列进行排序,如果不拉动所有超级列并循环数据,我无法在列中进行任何真正的搜索,对吗

我不想在不同的列族之间复制数据,所以我想确保Cassandra适合我。在Facebook、Digg、Twitter上,它们有很多搜索功能,所以也许我没有看到解决方案

Cassandra有没有办法搜索或过滤超级列或其关联列中的特定数据值?如果没有,是否还有其他NOSQL选项

在下面的例子中,我似乎只能查询phatduckk、friend1、John等。但是如果我想在Column家族中找到住在city==“Beverley Hills”的人呢?是否可以在不返回所有记录的情况下完成?如果是这样的话,我可以搜索city==“Beverley Hills”和state==“CA”吗?看起来我也做不到,但我想确定一下,看看我的选择是什么

AddressBook = { // this is a ColumnFamily of type Super
  phatduckk: {    // this is the key to this row inside the Super CF
    friend1: {street: "8th street", zip: "90210", city: "Beverley Hills", state: "CA"},
    John: {street: "Howard street", zip: "94404", city: "FC", state: "CA"},
    Kim: {street: "X street", zip: "87876", city: "Balls", state: "VA"},
    Tod: {street: "Jerry street", zip: "54556", city: "Cartoon", state: "CO"},
    Bob: {street: "Q Blvd", zip: "24252", city: "Nowhere", state: "MN"},
  }, // end row
  ieure: {     
    joey: {street: "A ave", zip: "55485", city: "Hell", state: "NV"},
    William: {street: "Armpit Dr", zip: "93301", city: "Bakersfield", state: "CA"},
  },

}您不能在Cassandra中执行此类操作。有一种特定类型的选择谓词可以在列键上设置,但不能在它们所持有的值上设置。查看并选中get\u slice/get\u SupersSlice和get\u range查询类型。同样,所有这些都与ColumnFamily或SuperColumnFamily中的键有关,而不是值


如果您想要所描述的那种功能,那么最好的选择是SQL数据库。在表上建立适当的索引,特别是在查询最多的列上,您将看到查询性能上的巨大差异。希望这有帮助。

您“不想在不同的列族之间复制数据”,但这就是在Cassandra中执行此类查询的方式。请参见

超级族不支持辅助索引,但支持常规列族。使用二级索引可以使用GetWhere语句

下面是我的一个PHP项目中的一个示例:

public function GetCodeWithValue( $_value )
{
    $result = $this->getDbFamily()->getWhere(array('value' => $_value, 'used' => 0));

    if ( $this->IsValid( $result ))
        return $result->key();
    else 
        return null;
}

这段代码使用了这个CassandraAPI:f

注意,由于提出了这个问题,Cassandra添加了对由Cassandra系统自动管理的索引的支持(我认为是从0.8开始)。这可以回答一些人的问题,而不是管理自己的索引

话虽如此,我还想提到,SQL数据库在创建索引时,会复制大量数据以生成所述索引。它在Cassandra中仍然非常便宜,特别是因为您可以对其进行大量优化。主要问题是,您必须手动维护一致性,而SQL则透明地为您维护一致性。但这两种机制使用完全相同的理论概念


这有点像用与应用程序相关的专门化重新编程自己的std::string。。。(以QString和CString为例!)

您能用任何其他NOSQL类型的设置执行这些类型的操作吗?你认为像Facebook这样的网站是如何与Cassandra进行不同类型的搜索/查询的?有多种方法可以搜索数据。你认为它在某些地方是重复的,并且只有多个列族允许以不同的方式搜索数据?@Hallik:有可能他们在不同的族中复制数据,当然我不能确定。这是一种选择;我在某个项目中使用Cassandra跟踪用户的活动、组的活动等,并创建了一系列超级柱族,用于输入/获取相关更新。然后我所需要做的就是执行查找。也许我只需要更加努力地摆脱关系数据库的思维模式。我确信有一种最佳的方法可以将我的数据从MySQL中移出,并在我的Cassandra应用程序中获得相同的功能。感谢您的输入。不客气:)最后一点输入-如果您的应用程序是数据和流程密集型的,请坚持使用SQL数据库。这个应用程序每月收集大量数据,使用户可以轻松地筛选数据,但是它变得越来越慢,尽管我已经为所有适当的列编制了索引,但到目前为止,没有人能够看到这些查询的问题。因此,我正在寻找替代方案。我可能会尝试创建许多列族。像上面的例子一样,我可以有一个城市CF、州CF等。然后作为该CF中的一列,一个与城市或州CF关联的用户UUID的JSON数组。我确定有一种方法可以做到这一点:)这可能是在Cassandra中获取数据的本质。如果您想要基于字段的查询,最好将该字段设置为键!感谢您提供此链接。帮助我验证许多我最初觉得有问题的设计决策:)是的,我越想它,就越意识到复制我想要查询的数据就像创建自己的索引,这不一定是坏事。我现在也在玩mongoDB,但我可能会换回来。只是在接下来的几周里做了很多测试。谢谢你的链接,真的很有帮助!