Кассандра (Pycassa/CQL) возвращает частичное совпадение

Я пытаюсь выполнить частичный поиск по семейству столбцов в Cassandra, аналогично SQL-запросу, например: SELECT * FROM columnfamily WHERE col = 'val*', где val * означает любое значение, соответствующее по крайней мере первым трем символам 'val'.

Я прочитал документацию datastax по функции SELECT, но, похоже, не могу найти поддержки частичным критериям WHERE. Есть идеи?

1 ответ

Решение

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

Вы бы взяли столбец, для которого вы хотите выполнить этот запрос, и переименовали его во второе семейство столбцов. Этот CF будет иметь одну широкую строку с именем столбца в качестве значения col Вы хотите сделать запрос по шаблону. Значением столбца для этого CF может быть либо ключ строки для исходного CF, либо какое-либо другое представление исходной строки.

Тогда вы бы использовали нарезку, чтобы получить значения, которые вас интересуют. Например, если это была широкая строка для нарезки:

 +---------+----------+--------+----------+---------+--------+----------+
 |  RowKey | aardvark | abacus | abacuses | abandon | accent | accident |
 |         +----------+--------+----------+---------+--------+----------+
 |         |          |        |          |         |        |          |
 |         |          |        |          |         |        |          |
 +---------+----------+-----------------------------+--------+----------+

Используя CQL, вы можете выбрать все, начиная с 'aba*', используя этот запрос *:

  SELECT 'aba'..'abb' from some_cf where RowKey = some_row_key;

Это даст вам столбцы для "abacus", "abacuses" и "покинуть".

Есть несколько вещей, которые нужно знать с этой стратегией:

  • В приведенном выше примере, если у вас есть вещи с одним и тем же column_name, у вас должен быть какой-то способ различать их (в противном случае вставка в широкое семейство столбцов приведет к засорению других допустимых значений). Один из способов сделать это - использовать составной столбец word:some_unique_value,
  • Вышеуказанная модель допускает только подстановочные знаки в конце строки. Дикие карты в начале строки также могут быть легко обработаны с помощью нескольких модификаций. Дикие карты в середине строки будут намного сложнее.

Помните, что Cassandra не дает вам простой способ выполнять специальные запросы. Вместо этого вам нужно выяснить, как вы будете использовать данные и соответственно моделировать свои CF. Взгляните на этот пост в блоге Эда Ануффа об индексации данных в Cassandra для получения дополнительной информации о таких модельных данных.

* Обратите внимание, что синтаксис CQL для нарезки столбцов меняется в следующем выпуске Cassandra.

Другие вопросы по тегам