Как искать в Кассандре без учета регистра?
Я учусь cassandra
с Python
и особенно с Django 2
с помощью cqlengine
, Я пытаюсь найти в базе данных, где я ищу строку, которая начинается с параметра поиска, но я хочу, чтобы она не чувствительна к регистру. Так что, если у меня есть следующие данные
-------------------------------
| PKID | String |
-------------------------------
| 1234 | FOObar |
| 4321 | FoOBar |
| 5665 | IreALLy |
| 5995 | DontknoW |
| 8765 | WHatTOdo |
| 4327 | foobaR |
-------------------------------
Так что, если я хочу найти строку, которая начинается с foo
Я должен получить все три записи. Я искал решение и нашел один комментарий к stackru, что в cassandra все есть байты, и поэтому это невозможно, но я также нашел что-то, что говорит, что для этого нужно написать собственную функцию.
Для Django я использую https://github.com/r4fek/django-cassandra-engine для создания модели. Это реализация cqlengine для django. Итак, когда я создаю свою модель, нужно ли что-нибудь добавить в нее? Моя тестовая модель
class TestModel(DjangoCassandraModel):
key_id = columns.UUID(primary_key=True, default=uuid.uuid4)
string = columns.Text()
Я искал это в документации по cqlengine, но не смог найти ничего полезного. Поэтому я ищу помощь здесь на stackru.
Благодарю.
1 ответ
Вы можете использовать так называемый SASI-индекс (SSTable Attached Secondary Index), чтобы сделать это в самой Cassandra (хотя он помечен как экспериментальная функция). Вы можете определить индексы для поиска по префиксу, диапазону или подстроке, а при настройке индекса вы можете указать, что вам нужны строки без учета регистра:
CREATE CUSTOM INDEX index_name ON table (field)
USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS = {
'mode': 'PREFIX', // if you want to search only for 'starting with'
'case_sensitive': 'false'
};
Хотя я не уверен, сможет ли cqlengine получить эту функциональность из коробки или нет.
Вот очень подробный пост в блоге о SASI-индексах.