在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."
答案 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