Volltextsuche
Durchsucht den Inhalt von Protokollen, Ereignissen und Alarmen als Teilstring. Ohne ALLOW FILTERING sind auch koreanische Texte möglich.
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 '%타임아웃%';
Kombinierbar mit Zeitreihen-Abfragemustern — Partition und Zeitbereich eingrenzen, dann im Inhalt suchen.
Index erstellen
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 akzeptiert einen Preset-Namen oder eine JSON-Definition.
| Preset | Tokenisierung | LIKE? | Verwendung |
|---|---|---|---|
ngram | Zeichen-n-Gramme (2–3) über den gesamten Wert, inkl. Leerzeichen, Groß-/Kleinschreibung beibehalten | Ja | Teilstringsuche in Protokollen und Nachrichten |
standard | Unicode-Wörter, kleingeschrieben | Nein | Wortgenaue Übereinstimmung |
cjk | Wörter + CJK-Bigramme, kleingeschrieben | Nein | Astra-kompatible CJK-Übereinstimmung |
keyword | Wert unverändert | Nein | Nur Analyzer, ohne Tokenisierung |
Für Teilstringsuche ist ngram die richtige Wahl — genau dafür existiert diese Funktion.
-- 대소문자를 무시하려면 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"}]
}' };
Mit lowercase ignoriert LIKE die Groß-/Kleinschreibung; ohne lowercase wird zwischen Groß- und Kleinschreibung unterschieden (Standard-SQL-Semantik).
Abfrage
-- 부분 문자열 — 단어 중간도 잡힙니다
... 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';
Kann mit Zeitreihenfunktionen kombiniert werden.
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);
Warum ist das exakt?
Der Index sorgt für die Trefferquote, die erneute Prüfung der Originalwerte für die Genauigkeit.
Da n-Gramme über den gesamten Wert (inkl. Leerzeichen und Satzzeichen) gleiten und indexiert werden, sind alle Gramme jedes Teilstrings garantiert im Index — keine falsch-negativen Ergebnisse. Falsch-positive Treffer, die durch zufällig verteilte Gramme entstehen, werden am Ende durch erneute Anwendung des ursprünglichen Musters auf den Originalwert herausgefiltert.
Dadurch werden auch koreanische Texte (CJK ebenfalls per n-Gramm), Fragmente mit Leerzeichen ('%프 정%') und Wortmitten ('%imeou%' → "timeout") erfasst.
Einschränkungen
index_analyzerkann nicht zusammen mit den alten Optionencase_sensitive,normalizeundasciiverwendet werden.- Kann nicht auf Primärschlüssel- oder Collections-Spalten angewendet werden.
- 🔴 Es gibt kein
ALTER INDEX. Um den Analyzer zu ändern,DROP INDEXund dannCREATE INDEX— ein vollständiger Neuaufbau. Das dauert im laufenden Betrieb; daher frühzeitig festlegen.