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
如何选择地图栏中由多个条目过滤的行(Cassandra 3.9)_Cassandra_Query Optimization_Data Modeling - Fatal编程技术网

如何选择地图栏中由多个条目过滤的行(Cassandra 3.9)

如何选择地图栏中由多个条目过滤的行(Cassandra 3.9),cassandra,query-optimization,data-modeling,Cassandra,Query Optimization,Data Modeling,我有一张这样的桌子: CREATE TABLE test.products ( id uuid PRIMARY KEY, name text, params map<text, text>); CREATE INDEX products_params_idx ON test.products (entries(params)); 假设该表中有3个产品具有这样的参数值: 1. {'param1' : 'value1', 'param2' : 'value2'} 2. {'param

我有一张这样的桌子:

CREATE TABLE test.products (
id uuid PRIMARY KEY,
name text,
params map<text, text>);
CREATE INDEX products_params_idx ON test.products (entries(params));
假设该表中有3个产品具有这样的参数值:

1. {'param1' : 'value1', 'param2' : 'value2'}
2. {'param1' : 'value1', 'param2' : 'othervalue'}
3. {'param3' : 'value3', 'param2' : 'value2'}
每个产品每个参数只能有一个值,但在整个数据库中,每个参数可以有N个参数和X个值

我可以毫无问题地进行这样的查询:

SELECT * FROM products WHERE params['param1'] = 'value1';
但主要的问题是,我如何进行这样的查询:

CREATE TABLE test.products (
id uuid PRIMARY KEY,
name text,
params map<text, text>);
CREATE INDEX products_params_idx ON test.products (entries(params));
现在我得到一个错误,它警告我效率:

InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING"

我是卡桑德拉和NoSQL的新手。我从Datastax课程中了解到,在Cassandra中,使用允许过滤是我最不应该做的事情。在卡桑德拉,有没有一个有效的方法来实现我想要的?也许我应该用一种完全不同的方式来建模?我将非常高兴在本主题中获得一些帮助。

如果您希望根据产品属性和值选择数据,根据参数和值列对主键进行建模,请为此类需求创建附加表

    create table name_by_param{
    param text,
    value text,
    uuid text,
    name text
    primary key ((param,value),uuid)
    } 
产品插入示例-Darthvedar

    insert into name_by_param (param,value,uuid,name) values ('birthname','ani','uuid1','darthvedar');
    insert into name_by_param (param,value,uuid,name) values ('side','darkside','uuid1','darthvedar');
    insert into name_by_param (param,value,uuid,name) values ('age','40','uuid1','darthvedar');
产品插入示例-欧比-万·克诺比

insert into name_by_param (param,value,uuid,name) values ('birthname','O-ben','uuid2','Obi-wan-kenobi');
insert into name_by_param (param,value,uuid,name) values ('side','force','uuid2','Obi-wan-kenobi');
insert into name_by_param (param,value,uuid,name) values ('age','40','uuid2','Obi-wan-kenobi');
选择查询-

select * from name_by_param where token(param,value) = token('birthname','ani') and token(param,value) =  token('side','force');

上面的查询应该返回两行,我自己还没有尝试过,但应该可以,希望这会有所帮助。

是的,您可以更改您的模型,因为您不能创建以map类型的paramcolumn作为主键或materialsed视图集合类型不能作为主键的一部分,计数器类型也不能。因此,如果要跳过“允许筛选”,则需要在查询中包含主键。集合是一次获取所有数据的小数据组。如果您希望在更精细的级别访问元组,并且仍然能够询问给定键的所有数据对,那么应该使用如下表:创建表详细信息键文本、详细信息键文本、详细信息值文本、主键、详细信息键;这将允许从详细信息中选择*,其中键=?以及从细节中选择*键=?和detail_key=?。我非常喜欢这个想法,但它似乎不能与相等运算符一起使用:param,如果它包含一个相等的值,则不能由多个关系限制-I如果我将其更改为gt或lt,它会起作用,但这显然没有解决问题。您是否尝试过或在t查询中,例如-tokenparam,value=token'birthname','ani'{或}tokenparam,value=token'side','force';此外,您还可以使用一个try-IN操作符示例-token。。在token…,token…,Sry中,Cassandra afaik中没有或等效,但我试图确定并得到语法错误。在select*from name_by_param中使用时,其中tokenparam、token'birthname'、'ani'、token'side'、'force'中的值;我也得到了一个错误,但略有不同:在输入“IN”时没有可行的替代方案。。。其中tokenparam,value[IN]…-也许这只是一些愚蠢的sytnax错误,但我无法理解。在文档之后-而且,只允许在分区键的最后一列和完整主键的最后一列上使用IN关系:/