Есть ли какой-нибудь запрос для Cassandra, такой же, как SQL: LIKE Condition? - PullRequest
24 голосов
/ 28 марта 2012

Условие LIKE позволяет нам использовать подстановочные знаки в предложении where инструкции SQL. Это позволяет нам выполнять сопоставление с образцом. Условие LIKE можно использовать в любом допустимом операторе SQL - выбрать, вставить, обновить или удалить. Как это

SELECT * FROM users
WHERE user_name like 'babu%';

как и в случае с вышеуказанной операцией, любой запрос доступен для Cassandra в CLI.

Ответы [ 4 ]

25 голосов
/ 19 июля 2017

Начиная с Cassandra 3.4 (рекомендуется 3.5), LIKE-запросы могут выполняться с использованием SASable Attached Secondary Index (SASI).

Например:

CREATE TABLE cycling.cyclist_name ( 
  id UUID PRIMARY KEY, 
  lastname text, 
  firstname text
);

Создание SASI следующим образом:

CREATE CUSTOM INDEX  fn_prefix ON cyclist_name (firstname)
USING 'org.apache.cassandra.index.sasi.SASIIndex';

Тогда работает префиксный запрос LIKE:

SELECT * FROM cyclist_name WHERE firstname LIKE 'M%';
SELECT * FROM cyclist_name WHERE firstname LIKE 'Mic%';

Эти примеры и другие параметры конфигурации, такие как суффиксные запросы, можно найти в документации

Более подробное объяснение того, как работает SASI, можно найти здесь .

14 голосов
/ 08 мая 2016

Я знаю: это старый вопрос, но есть решение для этой темы:

Вы не можете использовать оператор like в Кассандре, но вы можете использовать операторы диапазона, и с помощью оператора диапазона вы можете решить это «как« все% »»

Пример: У меня есть более одного продукта. Каждый продукт имеет свой собственный ключ раздела (первая часть первичного ключа):

CREATE TABLE user(productId int, username text, PRIMARY KEY(productId, username));

Теперь у меня есть несколько пользователей:

INSERT INTO user(productId, username) VALUES (1, 'anna');
INSERT INTO user(productId, username) VALUES (1, 'alpha');
INSERT INTO user(productId, username) VALUES (1, 'andreas');
INSERT INTO user(productId, username) VALUES (1, 'alex');
INSERT INTO user(productId, username) VALUES (1, 'bernd');
INSERT INTO user(productId, username) VALUES (1, 'bob');

Теперь я хочу найти всех пользователей, у которых есть в начале. В мире SQL я использую как 'a%' в Кассандре, я использую это:

SELECT * FROM user WHERE productId = 1 AND username >= 'a' AND username < 'b';

Результат:

productid | username
-----------+----------
     1 |     alex
     1 |    alpha
     1 |  andreas
     1 |     anna
13 голосов
/ 28 марта 2012

Простой ответ: нет эквивалента LIKE

https://docs.datastax.com/en/cql/3.3/cql/cql_reference/cqlSelect.html

Вот справочник команд для v0.8:

http://www.datastax.com/docs/0.8/references/cql#cql-reference

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

строка: имя пользователя: bab -> col: babu1, col: babar строка: имя пользователя: babu -> col: babur

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

7 голосов
/ 25 мая 2018

Я наткнулся на этот пост, когда искал решение для выполнения WHERE column_name LIKE '%keyword%' в Кассандре. Ответы были многообещающими, но не совсем касались моей проблемы.

CREATE CUSTOM INDEX idx_name ON keyspace.columnfamily (column_name) 
USING 'org.apache.cassandra.index.sasi.SASIIndex' 
WITH OPTIONS = {
'mode': 'CONTAINS', 
'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', 
'case_sensitive': 'false'};

Для того, чтобы %keyword% (два% s) работали, индекс должен иметь опции с режимом : СОДЕРЖИТ вместе с этим analyzer_class , чтобы сделать case_sensitive действует.

...