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 的地图中添加新值/更新现有值是不是会创建墓碑?
使用 CQL python 驱动程序的 Cassandra 环状态
如果结果集较大,则使用 Cassandra 和 DataStax Java 驱动程序时出现 NoHostAvailableException