全文搜索
在日志 · 事件 · 报警正文中进行子字符串搜索。无需ALLOW FILTERING,
也支持韩文。
SELECT ts, msg FROM logs
WHERE device = 'pump-01'
AND ts >= '2026-07-31 00:00' AND ts < '2026-07-31 01:00'
AND msg LIKE '%타임아웃%';
与时序查询模式直接结合——先缩小分区和时间范围,再用正文进行筛选。
创建索引
CREATE TABLE logs (
device text, ts timestamp, msg text,
PRIMARY KEY (device, ts)
) WITH CLUSTERING ORDER BY (ts ASC);
CREATE INDEX logs_msg_idx ON logs(msg) USING 'sai'
WITH OPTIONS = { 'index_analyzer': 'ngram' };
index_analyzer 接收预设名称或 JSON 定义。
| 预设 | 分词方式 | 支持LIKE? | 使用场景 |
|---|---|---|---|
ngram | 对整个值应用字符 n-gram(2~3),包含空格,保留大小写 | 是 | 日志 · 消息子字符串搜索 |
standard | Unicode 单词,转小写 | 否 | 单词级匹配 |
cjk | 单词 + CJK 双字组,转小写 | 否 | Astra 兼容 CJK 匹配 |
keyword | 整个值原样保留 | 否 | 不做分词,仅使用分析器 |
如果目标是子字符串搜索,应使用 ngram —— 这正是该功能存在的原因。
-- 대소문자를 무시하려면 lowercase 필터를 더한다
CREATE INDEX logs_msg_idx ON logs(msg) USING 'sai'
WITH OPTIONS = { 'index_analyzer': '{
"tokenizer": {"name": "ngram", "args": {"minGramSize": "2", "maxGramSize": "3"}},
"filters": [{"name": "lowercase"}]
}' };
若添加lowercase,则LIKE 忽略大小写;若不添加,则区分大小写
(标准 SQL 语义)。
查询
-- 부분 문자열 — 단어 중간도 잡힙니다
... AND msg LIKE '%timeout%';
-- 접두 · 접미 · 완전 일치
... AND msg LIKE 'connection%';
... AND msg LIKE '%port 9042';
... AND msg LIKE 'connection refused';
-- 조각 여러 개를 AND — 조건을 반복하면 됩니다
... AND msg LIKE '%connection%' AND msg LIKE '%refused%';
-- '=' 는 분석기를 거치되 «값 전체» 일치를 유지합니다
... AND msg = 'connection timeout on port 9042';
可以与时序函数混合使用。
SELECT time_bucket(5m, ts) AS bucket, count(*) AS errors
FROM logs
WHERE device = 'pump-01' AND ts >= ? AND ts < ? AND msg LIKE '%timeout%'
GROUP BY device, time_bucket(5m, ts);
为何精确
索引负责召回率,原始数据复查负责准确率。
n-gram 会滑过整个值(包括空格和标点),并建立索引,因此任何子字符串的所有 gram 必定已被索引——不存在漏检。 因 gram 分散而偶然匹配的误报, 最后会通过对原始值重新应用原始模式来过滤掉。
因此,韩文(CJK 同样使用 n-gram)、跨越空格的片段('%프 정%')、以及单词中间
('%imeou%' → "timeout")都能被捕获。
限制
index_analyzer无法与旧的case_sensitive·normalize·ascii选项同时使用。- 无法应用于主键列和集合列。
- 🔴 不提供
ALTER INDEX。 若要更换分析器,需先DROP INDEX,再进行CREATE INDEX—— 这需要完全重建。在运行期间会花费较长时间,因此请一开始就确定好。