跳到主要内容

全文搜索

在日志 · 事件 · 报警正文中进行子字符串搜索。无需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),包含空格,保留大小写是日志 · 消息子字符串搜索
standardUnicode 单词,转小写否单词级匹配
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 —— 这需要完全重建。在运行期间会花费较长时间,因此请一开始就确定好。

相关文档​