【发布时间】:2021-09-23 13:51:46
【问题描述】:
所以我在 Cassandra 3.11 中有这张表
CREATE TABLE somekeyspace."Message" (
id uuid,
"requestId" text,
"createdAt" timestamp,
attachments list<text>,
body text,
deleted boolean,
deleted_by text,
deleted_on timestamp,
"extraData" text,
"isRead" boolean,
"recipientBrandId" text,
"recipientId" text,
"recipientName" text,
"recipientSpaceId" text,
"requesterBrandId" text,
"requesterSpaceId" text,
"senderId" text,
"senderName" text,
PRIMARY KEY (id, "requestId", "createdAt")
) WITH CLUSTERING ORDER BY ("requestId" ASC, "createdAt" DESC)
AND bloom_filter_fp_chance = 0.01
AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
AND comment = ''
AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
AND crc_check_chance = 1.0
AND dclocal_read_repair_chance = 0.1
AND default_time_to_live = 0
AND gc_grace_seconds = 864000
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0.0
AND speculative_retry = '99PERCENTILE';
CREATE INDEX "Message_senderId_idx" ON coretail."Message" ("senderId");
CREATE INDEX "Message_requestId_idx" ON coretail."Message" ("requestId");
CREATE INDEX "Message_senderName_idx" ON coretail."Message" ("senderName");
CREATE CUSTOM INDEX fn_prefix ON coretail."Message" (body) USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS'};
CREATE INDEX "Message_isRead_idx" ON coretail."Message" ("isRead");
现在,我想执行以下查询之一:
SELECT * from "Message" WHERE ("senderId"=someUserId OR "recipientId"=someUserId) AND body LIKE '%someKeyword';
或者:
SELECT * from "Message" WHERE "senderId"=someUserId AND body LIKE '%foo';
我知道这些查询是无效的,问题是如何使它们起作用?
- 第一个不好,因为 Cassandra 不支持 OR
- 第二个不好,因为它需要 ALLOW FILTERING。
我的问题:我应该如何修改表才能选择 senderId 或 recipientId 为 X 并且“正文”与 LIKE 查询匹配的记录? ALLOW FILTERING 是低效的。如何有效且最好使用单个查询来做到这一点?
提前致谢!
【问题讨论】:
-
我的第一个想法是,如果您不打算通过
id进行查询,那么它应该是您的最后一个集群键而不是分区键。 -
考虑在 Cassandra 中使用太阳能搜索。