メインコンテンツまでスキップ

専門検索

ログ・イベント・アラーム本文を部分文字列で検索します。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 — 全体再構築です。運用中は時間がかかるため、最初に決定してください。

関連項目​