Похоже, ваш запрос после редактирования:
SELECT * FROM Users
WHERE accName = 'tear' and accContext = 'db1'
and accNumber> 20200101 and accNumber<= 202002018;
... отлично работает . Если вы укажете accName
(ключ раздела) и accContext
(1-й ключ кластеризации), вы абсолютно сможете выполнить запрос диапазона для целого числа, предполагая, что это следующая кластеризация next ключ. Однако, если вы удалите accContext
из вашего запроса, это не получится, потому что вы не дадите Кассандре достаточно информации для эффективного извлечения нужных данных.
SELECT * FROM Users WHERE accNumber> 20200101 and accNumber<= 202002018;
Так что это был ваш запрос, прежде чем редактировать с рабочим решением. И, конечно же, вы видели ошибку, в которой говорится, что запросы диапазона для ключей секций работают только с функцией token
.
Почему это так?
Возможно, вы слышал, что Cassandra требует «основанного на запросах» подхода к моделированию данных. Это потому, что все данные обычно не находятся на одном узле. Межузловые запросы дороги. Принудительный запрос диапазонов к ключам разделов с помощью token
дает вам инструменты для ограничения вашего запроса узлом, который отвечает за указанный диапазон c токенов. В вашем случае это работает:
aaron@cqlsh:stackoverflow> SELECT token(accname),accname FROM Users
WHERE token(accname) <= -6425313154088713591
AND token(accname) > -7367992452875979971;
system.token(accname) | accname
-----------------------+---------
-6611994791738996364 | tear
(1 rows)
Деконструируя то, что я сделал здесь, используя функцию token
в моем SELECT, я могу видеть, что такое токен строки "tear". Затем я могу запросить system.peers
, чтобы узнать, какие узлы отвечают за этот токен, а также получить точные сведения о диапазонах токенов, за которые отвечают целевые узлы.