Сортировать по и нравится в том же 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 не является хорошим выбором.

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