如何搜索cassandra不区分大小写?

时间:2018-05-20 04:48:24

标签: python django cassandra cqlengine

我正在使用cassandra学习Python,并使用Django 2专门与cqlengine学习。我试图在数据库中搜索,我搜索以搜索参数开头的字符串,但我想让它不区分大小写。如果我有以下数据

-------------------------------
|    PKID    |     String     |
-------------------------------
|    1234    |     FOObar     |
|    4321    |     FoOBar     |
|    5665    |     IreALLy    |
|    5995    |     DontknoW   |
|    8765    |     WHatTOdo   |
|    4327    |     foobaR     |
-------------------------------

因此,如果我想搜索以foo开头的字符串,我应该获得所有三条记录。我搜索了解决方案,我发现有一条关于stackoverflow的注释,cassandra中的所有内容都是字节的,所以这是不可能的,但我也发现了一些东西,说我需要编写自定义函数来实现它。

对于Django,我使用django-cassandra-engine来创建模型。它是django的cqlengine的一个实现。所以当我创建我的模型时,我需要在其中添加任何内容吗?我的测试模型是

class TestModel(DjangoCassandraModel):
    key_id = columns.UUID(primary_key=True, default=uuid.uuid4)
    string = columns.Text()

我在cqlengine docs中找了它,但找不到任何有用的东西。所以我在stackoverflow上寻求帮助。

感谢。

1 个答案:

答案 0 :(得分:4)

您可以使用所谓的SASI-index (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索引的very detailed blog post