Сортировать по и нравится в том же Cassandra Query
Я хочу выполнить этот запрос к таблице cassandra:
select query,score,term from mytable where term
like '%bottle%' order by score desc limit 10;
Единственными столбцами таблицы являются запрос, оценка, срок.
Я создаю таблицу следующим образом:
CREATE TABLE mytable( "term" TEXT, "query" TEXT, "score" double,
PRIMARY KEY ("term","score")) WITH CLUSTERING ORDER BY (score desc);
У меня также есть индекс:
Это дает все виды сумасшедших ошибок. Первый:
InvalidRequest: code=2200 [Invalid query] message="LIKE restriction is
only supported on properly indexed columns. term LIKE 'bottle' is not valid."
Если я заменю LIKE на equals, запрос сработает. Но мне нужно, как и порядок. Итак, после некоторого поиска в Google, я подумал, что буду использовать индекс SASI.
CREATE CUSTOM INDEX term_idx2 ON mytable (term) USING
'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {
'analyzer_class':
'org.apache.cassandra.index.sasi.analyzer.StandardAnalyzer',
'case_sensitive': 'false'};
Это приводит к другому сообщению об ошибке:
InvalidRequest: code=2200 [Invalid query] message=
"Cannot create secondary index on partition key column term"
ХОРОШО. Это может означать, что если я хочу использовать LIKE, мне не следует создавать вторичный индекс для "term". Тогда давайте попробуем выполнить запрос по запросу. Запрос становится:
select query,score,term from mytable where query
like '%bottle%' order by score desc limit 10;
Теперь это приводит к ошибке "use ALLOW FILTERING". По сути, приводит меня к созданию индекса по запросу. Даже создание индекса типа SASI по запросу не помогает.
Это вообще возможно?
1 ответ
Нет! Вы не можете использовать все как и порядок в том же запросе.
Вы уже знаете, что не можете создавать индексы для первичных ключей и ключей кластеризации. Однако вы можете создавать индексы для других столбцов, например: query
с помощью следующей команды:
CREATE CUSTOM INDEX mytable_query_idx ON mytable ("query")
USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS = {'mode': 'CONTAINS',
'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.StandardAnalyzer',
'case_sensitive': 'false'};
И после этого вы делаете запрос, как
SELECT * FROM mytable WHERE query LIKE '%abc%';
Но вы не можете использовать порядок и как в том же запросе, потому что
Msgstr "ORDER BY со вторыми индексами не поддерживается."
Howerver, если вам действительно нужны эти функции, Cassandra не является хорошим выбором.