Cassandra, выберите через не первичный ключ

Я новичок в cassandra, и я столкнулся с проблемой. Я создал демодублирование ключей и пользователей таблицы. Эта таблица получила 3 ​​столбца: id (int и первичный ключ), имя (varchar), имя (varchar). этот запрос присылайте мне хороший результат:

SELECT * FROM demodb.users WHERE id = 3;

но этот:

SELECT * FROM demodb.users WHERE firstname = 'francois';

не работает, и я получаю следующее сообщение об ошибке:

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

Этот запрос также не работает:

SELECT * FROM users WHERE firstname  = 'francois'  ORDER BY id DESC LIMIT 5;
InvalidRequest: code=2200 [Invalid query] message="ORDER BY with 2ndary indexes is not supported."

Спасибо заранее.

Ответ 1

Этот запрос также не работает:

Это потому, что вы неправильно понимаете, как порядок сортировки работает в Кассандре. Вместо использования вторичного индекса на firstname создайте таблицу специально для этого запроса, например:

CREATE TABLE usersByFirstName (
  id int,
  firstname text,
  lastname text,
  PRIMARY KEY (firstname,id));

Теперь этот запрос должен работать:

SELECT * FROM usersByFirstName WHERE firstname='francois'
ORDER BY id DESC LIMIT 5;

Обратите внимание, что я создал составной первичный ключ на firstname и id. Это приведет к разделению данных на firstname (позволяя вам выполнить запрос), а также кластеризации ваших данных с помощью id. По умолчанию ваши данные будут группироваться по id в порядке возрастания. Чтобы изменить это поведение, вы можете указать CLUSTERING ORDER в инструкции создания таблицы:

WITH CLUSTERING ORDER BY (id DESC)

... и тогда вам даже не понадобится предложение ORDER BY.

Недавно я написал статью о том, как работает кластеризация в Cassandra ( "У нас есть заказ" ). Он объясняет это и охватывает также некоторые стратегии упорядочения.

Ответ 2

В кассандре есть одно ограничение: любое поле, которое вы хотите использовать в предложении where, должно быть основным ключом таблицы, или на нем должен быть вторичный индекс. Поэтому вам нужно создать индекс для firstname, и только после этого вы можете использовать firstname в условии where, и вы получите ожидаемый результат.