Cassandra (Datastax) CQL 忽略 TEXT 列的大小写

Posted

技术标签:

【中文标题】Cassandra (Datastax) CQL 忽略 TEXT 列的大小写【英文标题】:Cassandra (Datastax ) CQL ignore case of TEXT column 【发布时间】:2020-08-27 07:46:01 【问题描述】:

我使用以下 CQL 创建了表:我想运行查询以按演员姓名查找所有视频(不区分大小写)。

CREATE TABLE video_by_actor(
    actor text, added_date timestamp, video_id timeuuid, 
    character_name text, description text,
    encoding frozen<video_encoding>,
    tags set<text>, title text, user_id uuid,
primary key ((actor), added_date)) with clustering order by (added_date desc);


select * from video_by_actor where actor='Tom Hanks'

我想从表中选择所有行,而不考虑演员的姓名大小写,例如。 “汤姆汉克斯”、“汤姆汉克斯”、“汤姆汉克斯”等

有可能吗?

【问题讨论】:

来自 Cassandra 开发者论坛:这对于常规 CQL 查询是不可能的,但您有几个选择: 1. 在您的表中创建一个特殊列来存储您想要搜索的规范化字符串。 2. 使用 SASI 索引。 3. 使用 DSE 搜索。 【参考方案1】:

我想搜索所有案例

首先,如果你想“搜索”,你需要一个不同的工具,比如 ElasticSearch。 Cassandra 用于基于键的查询,这与搜索有很大不同。

不,Cassandra 确实无法实现您想要做的事情,因为它关心大小写。我创建了上面描述的表定义,并插入了四行,每行都有一个与 Tom Hanks 的名字不同的案例应用程序。然后我用token函数查询了结果:

aploetz@cqlsh:***> SELECT actor,token(actor),title FROM video_by_actor ;

 actor     | system.token(actor)  | title
-----------+----------------------+---------------------
 Tom Hanks | -4258050846863339499 |        Forrest Gump
 Tom hanks | -3872727890651172910 | Saving Private Ryan
 tom Hanks | -3300209463718095087 | Joe vs. the Volcano
 tom hanks |  1022609553103151654 |           Apollo 13

(4 rows)

请注意“汤姆汉克斯”的每个不同案例如何生成不同的令牌。由于此表在actor 上进行分区,这意味着这些行可能会存储在不同的节点上。

同样,您可能希望使用实际的搜索引擎来处理类似的事情。他们将拥有分析器之类的工具,可以启用“模糊匹配”等功能。

【讨论】:

以上是关于Cassandra (Datastax) CQL 忽略 TEXT 列的大小写的主要内容,如果未能解决你的问题,请参考以下文章

在 cassandra 的地图中添加新值/更新现有值是不是会创建墓碑?

Cassandra 3.11.1 地理空间支持

使用 CQL python 驱动程序的 Cassandra 环状态

Cassandra 中的列表大小

如果结果集较大,则使用 Cassandra 和 DataStax Java 驱动程序时出现 NoHostAvailableException

可以通过 Cassandra Datastax 驱动程序从文件中加载语句吗?