如何在使用cassandradb的二级索引上使用order by(排序)

zhte4eai  于 2021-06-15  发布在  Cassandra
关注(0)|答案(1)|浏览(486)

我的表架构是:

CREATE TABLE users
(user_id BIGINT PRIMARY KEY, 
user_name text, 
email_ text);

我把下面几行插入表格。

INSERT INTO users(user_id, email_, user_name)
VALUES(1, 'abc@test.com', 'ABC');

INSERT INTO users(user_id, email_, user_name)
VALUES(2, 'abc@test.com', 'ZYX ABC');

INSERT INTO users(user_id, email_, user_name)
VALUES(3, 'abc@test.com', 'Test ABC');

INSERT INTO users(user_id, email_, user_name)
VALUES(4, 'abc@test.com', 'C ABC');

用于将数据搜索到 user_name 列中,我创建了一个索引来使用 LIKE 操作员 '%%' :

CREATE CUSTOM INDEX  idx_users_user_name ON users (user_name)
USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS = {
'mode': 'CONTAINS',
'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', 
'case_sensitive': 'false'};

problem:1 when 我正在执行下面的查询,它只返回3条记录,而不是4条。

select * 
from users 
where user_name like '%ABC%';

problem:2 when 我用下面的查询,它给出了一个错误

ERROR: com.datastax.driver.core.exceptions.InvalidQueryException: 
ORDER BY with 2ndary indexes is not supported. 
Query =select * from users where user_name like '%ABC%' ORDER BY user_name ASC;

查询:

select * 
from users 
where user_name like '%ABC%' 
ORDER BY user_name ASC;

我的要求是过滤 user_nameorder by user_name .

yshpjwxd

yshpjwxd1#

第一个查询使用 cassandra:latest 这就是现在 cassandra:3.11.3 . 您可能需要再次检查插入的数据(或者使用您提供的cql语句从头开始重新创建)。
第二种方法提供了足够的信息—在cassandra中,通过二级索引进行排序是不可能的。您可能需要对应用程序中的结果集进行排序。
也就是说,我不建议在真正的应用程序中运行此设置。有了一些额外的规模(当你有许多记录),这将是一个自杀的表现明智。我不应该深入太多细节,因为也许你已经了解这一点,所以不是一个wikia/文档网站,所以这里有一个链接。

相关问题