Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nosql Cassandra将综合指数和次级指数结合起来_Nosql_Cassandra_Cql - Fatal编程技术网

Nosql Cassandra将综合指数和次级指数结合起来

Nosql Cassandra将综合指数和次级指数结合起来,nosql,cassandra,cql,Nosql,Cassandra,Cql,我们希望使用cassandra存储复杂数据 但我们不知道如何组织索引 我们的表(列族)如下所示: Users = { RandomId int, Firstname varchar, Lastname varchar, Age int, Country int, ChildCount int } 我们的查询包含必填字段(Firstname、Lastname、Age)和额外的搜索选项(Country、ChildCount)。 我们应该如何

我们希望使用cassandra存储复杂数据
但我们不知道如何组织索引

我们的表(列族)如下所示:

Users =
  { 
    RandomId int,
    Firstname varchar,
    Lastname varchar,
    Age int,
    Country int,
    ChildCount int
  }
我们的查询包含必填字段(Firstname、Lastname、Age)和额外的搜索选项(Country、ChildCount)。
我们应该如何组织索引以加快此类查询

首先,我认为,在(名字、姓氏、年龄)上建立综合索引,并在其余字段(国家和儿童计数)上添加单独的二级索引是很自然的。
但在创建二级索引之后,我不能将行插入表中,也不能查询表

使用

  • 卡桑德拉1.1.0
  • 带有--cql3选项的cqlsh

欢迎提出任何其他解决问题的建议(带有强制性和附加选项的复杂查询)。

这是我的想法。您可以简单地创建一个列族,使用您的RandomId作为行键,将所有剩余字段简单地作为列(例如,列名'firstname',列值'jonh')。在此之后,您必须为这些列中的每一列创建二级索引。您的值的基数似乎较低,因此应该稍微有效一些

CQL代码应该类似于:

create column family users with comparator=UTF8Type and column_metadata=[{column_name:  firstname, validation_class: UTF8Type,index_type: KEYS},
{column_name: lastname, validation_class: UTF8Type, index_type: KEYS},
{column_name: contry, validation_class: IntegerType, index_type: KEYS},
{column_name: age, validation_class: IntegerType, index_type: KEYS]},
{column_name: ChildCount, validation_class: IntegerType, index_type: KEYS]];
这可能是一个很好的参考


如果我错了,请告诉我

对于涉及大量分区的查询,索引不是很有效

我认为最好是根据您想要进行的查询来考虑表:您需要一个用于基于用户名的查询的表,而这似乎是存储有关用户的所有信息的正确位置。另一方面,我假设,你希望能够基于国家进行搜索,以提供一个用户列表:因此,你并不需要所有的信息,可能只是名字和姓氏,或者只是电子邮件等。然后,另一个表可以这样做

这涉及到一些数据复制,但更符合Cassandra数据建模思想

这将使:

CREATE TABLE users(
   id UUID,
   lastname TEXT,
   firstname TEXT,
   age INT,
   country TEXT,
   childcount INT,
   PRIMARY KEY(UUID)
);

CREATE TABLE users_by_country(
   country TEXT,
   firstname TEXT,
   lastname TEXT,
   user_uuid UUID,
   PRIMARY KEY((country), firstname, lastname)
);

CREATE TABLE users_by_age(
   age INT,
   firstname TEXT,
   lastname TEXT,
   user_uuid UUID,
   PRIMARY KEY((age), firstname, lastname)
);