Кассандра: перечислить все таблицы в пространстве ключей на основе ограничений, таких как LIKE или CONTAINS?

У меня много таблиц на каждое пространство ключей, поэтому я хотел бы отфильтровать таблицы на основе критериев ограничения. Я пробовал этот запрос, но он не дает желаемого результата:

SELECT table_name FROM system_schema.tables 
WHERE keyspace_name = 'test' 
and table_name >= 'test_001_%';

Показанный результат:

'table_name'
---------------------
 'test_001_metadata'    
 'test_001_time1'    
 'test_001_time2'    
 'test_001_time3'    
 'test_001_time4'    
 'test_002_metadata'    
 'test_002_time1'    
 'test_002_time2'
 'test_002_time3'

То, что я действительно хочу: Показанный результат:

'table_name'
---------------------
 'test_001_metadata'    
 'test_001_time1'    
 'test_001_time2'    
 'test_001_time3'    
 'test_001_time4'   

Другой выход - использовать LIKE ключевое слово путем создания вторичного индекса для table_name. Но я немного скептически отношусь, если это может вызвать проблемы, поскольку это системная таблица. Другая проблема заключается в том, поддерживает ли столбец кластеризации ФАКТИЧЕСКИЙ вспомогательный индекс?

1 ответ

Решение

Создать SASI Индекс с режимом содержит на table_name столбец после удаления предыдущего индекса и попробуйте запрос как

SELECT table_name FROM system_schema.tables 
WHERE keyspace_name = 'test' 
and table_name LIKE '%test_001_%';

Команда для создания SASI Индекс с режимом содержит следующее:

CREATE CUSTOM INDEX ON system_schema.tables(table_name) 
USING 'org.apache.cassandra.index.sasi.SASIIndex' 
WITH OPTIONS = {'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.StandardAnalyzer', 
'case_sensitive': 'false', 'tokenization_normalize_uppercase': 'true', 'mode': 'CONTAINS'} 

И что касается вашего второго вопроса, вы не можете создать вторичный индекс для чего-либо, что является частью PRIMARY KEY,

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