【问题标题】:How to search based on value in list in cassandra database 2.2.1如何根据 cassandra 数据库 2.2.1 中列表中的值进行搜索
【发布时间】:2016-02-01 08:29:12
【问题描述】:
create table tbl_master_values (
dbid int primary key,
user_dbid int, reg_dbid int,
module_dbid int,
fields_value map<text,list<text>>,
created_date timestamp,
modified_date timestamp);

CREATE INDEX idx_fields_value ON tbl_master_values (keys(fields_value));

Fields_values 列包含此值:

{'287': ['28'], '288': [''], '289': [''], '291': ['33'], '295': [''],'309': ['214', '215']} 

现在我想根据 fields_value 列映射内的列表中的值进行搜索。我也试过这个:

cqlsh:sampledb> select * from tbl_master_values where fields_value['309'] contains '215';

它显示如下错误:

InvalidRequest: code=2200 [Invalid query] message="No secondary indexes on
the restricted columns support the provided operators: 'fields_value = <value>'"

cqlsh:crmdb> select * from tbl_master_values where fields_value['309']=['215'];

它显示如下错误:

InvalidRequest: code=2200 [Invalid query] message="No secondary indexes on 
the restricted columns support the provided operators: 'fields_value = <value>'"

【问题讨论】:

    标签: list search dictionary cassandra


    【解决方案1】:

    您需要的是条目上的索引,而不仅仅是地图键上的索引

    试试这个

    CREATE INDEX idx_fields_value ON tbl_master_values (ENTRIES(fields_value));
    

    但更一般地说,这种二级索引不能很好地随集群大小扩展,因为每个请求都会命中很多节点(确切地说是节点数/RF)

    【讨论】:

    • cqlsh:crmdb> select * from tbl_master_values where fields_value['309']='214'; InvalidRequest: code=2200 [Invalid query] message="Invalid STRING constant (214) for "value(fields_value)" of freeze>"
    • select * from tbl_master_values where fields_value['309']=['214']--> map 的值必须用方括号括起来,因为它是一个 List
    • '309': ['214', '215'] 在此我想检查列表是否包含 214
    • 由于列表被冻结,因此只能查询列表的整个内容,例如:给我所有列表内容 = xxx 的地图。您不能只询问冻结列表是否包含某些元素
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多