Вопрос 1
Для коллекций карт Cassandra позволяет создавать индекс по ключам, значениям или записям (это доступно только для карт).
Итак, сначалаВы должны создать свой индекс на карте:
CREATE INDEX <index_name> ON <table_name> (ENTRIES(<map_column>));
Тогда вы можете запросить:
SELECT * FROM <table_name> WHERE <map_column>['<map_key>'] = '<map_value>';
Другое решение - заморозить вашу коллекцию и создать для нее индекс:
CREATE INDEX <index_name> ON table (FULL(<map_column>));
Затем вы можете запросить значения с помощью:
SELECT * FROM <table_name> WHERE <map_column> = ['<value>'...];
Я думаю, что приведенные выше решения не очень хороши, поскольку вы можете легко сканировать весь кластер.Ваш тип доступа будет использовать и индексировать, а не ключ раздела.
Вопрос 2
Другим решением будет создание таблицы, подобной этой:
CREATE TABLE <table_name> ( key TEXT, value TEXT, name TEXT, PRIMARY KEY ((key, value), name));
В столбцах ключа и значения будут храниться значения для тегов.Они также будут ключом раздела, чтобы вы могли запрашивать ваши данные, например:
SELECT * FROM <table_name> WHERE key = 'key' AND value = 'value';
Вам нужно будет выполнить несколько запросов, чтобы найти все теги, но вы можете агрегировать результат на уровне приложения.