Кассандра запрос по карте - PullRequest
0 голосов
/ 05 октября 2018

У меня есть таблица со следующим столбцом,

name text, //partition key
tags map<text, text>

У меня также есть вторичный индекс для столбца «теги».Теперь я хочу запросить, как,

select * from <table_name> where tags contains {'a':'b','x':'y'}
  1. Возможно ли это?Если нет, могу ли я запрашивать только «содержит {'a': 'b'}"?
  2. Это плохой дизайн?Если да, как это исправить?(примечание: имя имеет 1-> n отношение с тегами)

1 Ответ

0 голосов
/ 05 октября 2018

Вопрос 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';

Вам нужно будет выполнить несколько запросов, чтобы найти все теги, но вы можете агрегировать результат на уровне приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...