【问题标题】:How to search in cassandra case-insensitive?如何在 cassandra 中搜索不区分大小写?
【发布时间】:2018-10-30 02:26:19
【问题描述】:

我正在学习 cassandraPython,特别是使用 cqlengineDjango 2。我正在尝试在数据库中搜索以搜索参数开头的字符串,但我想让它不区分大小写。所以如果我有以下数据

-------------------------------
|    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 文档中寻找它,但找不到任何有用的东西。所以我在这里寻求关于stackoverflow的帮助。

谢谢。

【问题讨论】:

    标签: python django cassandra cqlengine


    【解决方案1】:

    您可以使用所谓的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

    【讨论】:

    • 谢谢@Alex。我将阅读博客文章并尝试在我的数据库中实现它,看看我是否可以让它工作。
    • 我正在使用这个:在 device_by_username (comm_nr) 上创建自定义索引使用 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = { 'analyzed' : 'true', 'analyzer_class' : 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', 'case_sensitive' : 'false', 'mode' : 'CONTAINS' };到目前为止似乎有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2013-09-26
    • 2023-03-20
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多