Есть ли запрос для Cassandra так же, как SQL: LIKE Condition? - программирование
Подтвердить что ты не робот

Есть ли запрос для Cassandra так же, как SQL: LIKE Condition?

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

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

подобно той же самой операции, любой запрос доступен для Cassandra в CLI.

4b9b3361

Ответ 1

Простой ответ: нет эквивалента 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

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

Ответ 2

Так как Cassandra 3.4 (рекомендуется 3.5), запросы LIKE могут быть достигнуты с использованием SSTable 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, можно найти здесь.

Ответ 3

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

Вы не можете использовать оператор 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 я использую как "%" в Кассандре, я использую это:

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

Результат:

productid | username
-----------+----------
     1 |     alex
     1 |    alpha
     1 |  andreas
     1 |     anna

Ответ 4

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

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) работало, индекс должен иметь параметры с mode: CONTAINS вместе с этим analyzer_class, чтобы сделать case_sensitive эффективным.