専門検索
ログ・イベント・アラーム本文を部分文字列で検索します。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 | ユニコード単語、小文字化 | いいえ | 単語単位の一致 |
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が値全体(空白・句読点含む)を滑るようにインデックスされるため、任意の部分文字列のすべての グラムは必ずインデックスされています — 誤検出(偽陰性)がありません。 グラムが散らばって偶然ヒットした誤検出(偽陽性)は 最後に元の値に元のパターンをそのまま再適用してフィルタリングします。
そのため、韓国語でも(CJKも同様にn-gram)、空白をまたぐ断片('%프 정%')も、単語途中
('%imeou%' → "timeout")もヒットします。
制約
index_analyzerは古いcase_sensitive・normalize・asciiオプションと一緒に使用できません。- 主キーカラムとコレクションカラムには設定できません。
- 🔴
ALTER INDEXがありません。 アナライザを変更するにはDROP INDEX後にCREATE INDEX— 全体再構築です。運用中は時間がかかるため、最初に決定してください。