在cassandra的主键上匹配'like'的模式

时间:2018-02-13 08:24:49

标签: cassandra nosql cql cql3 cassandra-3.0

在Cassandra中,'like'可用于查找满足SASI索引列上搜索模式的匹配结果,但它工作得非常好,但如何在主键上使用。

这是我的表:

CREATE TABLE indexxx (
    title VARCHAR,
    PRIMARY KEY (title));

主键上不允许建立索引

CREATE CUSTOM INDEX testtt ON indexxx (title) USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.StandardAnalyzer', 'case_sensitive': 'false'};



InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot create secondary index on partition key column title"

当尝试使用没有sasi索引时,

select * from indexxx  where title like '%kkk%' ;

InvalidRequest: Error from server: code=2200 [Invalid query] message="LIKE restriction is only supported on properly indexed columns. title LIKE '%kkk%' is not valid." 

3 个答案:

答案 0 :(得分:2)

无法在主键的分区列上使用LIKE子句。这是因为分区值始终是哈希值,并且在搜索时仅使用相应的标记。

但是,您可以借助SASI索引在聚类列或任何其他非集合列(未设置,映射或列表)上使用LIKE子句。

答案 1 :(得分:1)

您可以创建另一个包含与title相同的值的列,将其称为title_sasi,并在此新列上应用索引。

表结构将为

CREATE TABLE indexxx (
    title VARCHAR,
    title_sasi VARCHAR,
    PRIMARY KEY (title));

索引:

CREATE CUSTOM INDEX testtt ON indexxx (title_sasi) USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.StandardAnalyzer', 'case_sensitive': 'false'};

答案 2 :(得分:0)

您可以使用SASI注释或查询对非主要属性使用like(包含)。 注释支持在2.2.7.RELEASE春季数据发布中提供

@Indexed
@SASI(indexMode = IndexMode.CONTAINS)
@SASI.StandardAnalyzed