【问题标题】:Cassandra (Datastax ) CQL ignore case of TEXT columnCassandra (Datastax) CQL 忽略 TEXT 列的大小写
【发布时间】: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 搜索。

标签: cassandra datastax cql


【解决方案1】:

我想搜索所有案例

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

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

aploetz@cqlsh:stackoverflow> 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 上进行分区,这意味着这些行可能会存储在不同的节点上。

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

【讨论】:

    猜你喜欢
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 2014-02-08
    • 2021-05-18
    • 1970-01-01
    相关资源
    最近更新 更多