Есть ли запрос для Cassandra так же, как SQL: LIKE Condition?
Условие LIKE
позволяет использовать подстановочные знаки в предложении where инструкции SQL. Это позволяет нам выполнить сопоставление образцов. Условие LIKE
может использоваться в любом действительном запросе SQL - выбирать, вставлять, обновлять или удалять. Как этот
SELECT * FROM users
WHERE user_name like 'babu%';
подобно той же самой операции, любой запрос доступен для Cassandra в CLI.
Ответы
Ответ 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 эффективным.