전문 검색
로그 · 이벤트 · 알람 본문을 부분 문자열로 찾습니다. 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— 전체 재구축입니다. 운영 중에는 시간이 걸리므로 처음에 정하십시오.