역색인(텍스트 검색)
텍스트 검색은 데이터 세트에서 특정 용어나 구문이 포함된 문서를 검색하고 관련도에 따라 결과의 순위를 매깁니다.
| 검색 방식 | 강점 | 적용 시나리오 |
|---|---|---|
| 텍스트 검색 | "정확하게 찾기": 제어와 설명이 가능한 정확한 매칭으로 키워드 일치와 필터 조건 충족을 확실하게 보장 | 키워드 검색, 구문 매칭, 불리언 필터링 |
| 벡터 검색 | "폭넓게 찾기": 의미적 유사성을 활용하여 검색 범위를 확장 | 의미 검색, 근사 매칭 |
생성형 AI 애플리케이션, 특히 검색 증강 생성(RAG) 시나리오에서 텍스트 검색과 벡터 검색은 서로를 보완합니다.
- 의미적 포괄성과 어휘적 정밀성 사이의 균형 유지
- 결과의 정확성과 설명 가능성을 보장하면서 재현율 향상
- 두 방식을 함께 사용하여 대규모 언어 모델에 더 정확하고 관련성 높은 맥락을 제공하는 신뢰할 수 있는 검색 기반 구축
새 인덱스에는 V2 또는 V3를 사용하세요. 기존 V1 테이블은 계속 읽을 수 있지만, 역색인을 추가하거나 ALTER TABLE로 기존 테이블의 인덱스 저장 형식을 업그레이드할 수는 없습니다. 대신 테이블을 다시 생성해야 합니다. 적용되는 inverted_index_storage_format 설정이 V1로 남아 있으면 업그레이드 후 FE를 시작할 수 없습니다. 미리 fe.conf와 fe_custom.conf를 수정하세요. 4.1.5로 업그레이드를 참고하세요.
Doris 텍스트 검색의 발전 과정
Doris는 2.0.0 버전부터 고성능 전문 검색을 지원하기 위해 역색인을 도입했습니다. 검색 시나리오가 다양해지고 쿼리가 복잡해짐에 따라 이후 릴리스에서도 텍스트 검색 기능을 지속적으로 확장해 왔습니다.
| 단계 | 버전 | 주요 기능 |
|---|---|---|
| 기반 구축 | 2.0+ | 컬럼 단위 역색인 도입. 기본 전문 검색 연산자(MATCH_ANY, MATCH_ALL)와 다국어 토크나이저를 제공하여 대규모 데이터 세트에서 효율적인 키워드 검색 지원 |
| 기능 확장 | 2.x~3.x | 연산자 체계를 강화하고 구문 매칭(MATCH_PHRASE), 접두사 검색(MATCH_PHRASE_PREFIX), 정규식 매칭(MATCH_REGEXP) 등의 고급 연산자 추가. 3.1 버전에서 사용자 정의 토큰화 도입 |
| 기능 고도화 | 4.0+ | BM25 관련도 점수 산정과 통합 쿼리 진입점인 SEARCH 함수를 도입하여 텍스트 관련도 순위 및 하이브리드 순위 산정 지원 |
4.0+의 주요 개선 사항은 다음과 같습니다.
- BM25 관련도 점수 산정:
score()함수는 텍스트 관련도에 따라 결과의 순위를 매기며, 벡터 유사도 점수와 결합하여 하이브리드 순위를 산정할 수 있습니다. - SEARCH 함수: 여러 컬럼에 걸친 쿼리와 불리언 논리 조합을 지원하는 통합 쿼리 DSL을 제공합니다. 복잡한 쿼리 구성을 간소화하고 쿼리 성능도 더욱 향상시킵니다.
Doris 텍스트 검색의 핵심 기능
1. 다양한 텍스트 연산자
Doris는 다양한 검색 패턴을 지원하는 전문 검색 연산자를 제공하여 기본적인 키워드 매칭부터 복잡한 구문 쿼리까지 폭넓은 요구 사항을 충족합니다.
현재 버전에서 지원하는 주요 연산자는 다음과 같습니다.
| 연산자 | 설명 | 일반적인 시나리오 |
|---|---|---|
MATCH_ANY / MATCH_ALL | 하나 이상의 용어 매칭(OR) 및 모든 용어 매칭(AND) | 일반적인 키워드 검색 |
MATCH_PHRASE | 정확한 구문 매칭. 사용자 정의 slop과 순서 제어 지원 | 단어 간 근접성 쿼리 |
MATCH_PHRASE_PREFIX | 구문 접두사 매칭 | 자동 완성, 점진적 검색 |
MATCH_REGEXP | 정규식 기반 매칭 | 패턴 기반 텍스트 검색 |
이 연산자들은 개별적으로 사용하거나 SEARCH() 함수를 통해 조합하여 복잡한 논리 쿼리를 구성할 수 있습니다. 예를 들면 다음과 같습니다.
-- Exact phrase search
SELECT * FROM docs WHERE content MATCH_PHRASE 'inverted index';
-- Prefix search
SELECT * FROM docs WHERE content MATCH_PHRASE_PREFIX 'data ware';
2. 사용자 정의 토큰화(3.1+)
텍스트 검색에서 토큰화 방식은 검색의 정밀도와 재현율을 직접 결정합니다. Doris는 3.1 버전부터 사용자 정의 분석기를 지원하므로 비즈니스 요구 사항에 맞게 토큰화 파이프라인을 유연하게 정의할 수 있습니다.
사용자 정의 토큰화는 다음 세 가지 유형의 구성 요소를 조합하여 텍스트를 세밀하게 제어합니다.
- 문자 필터(char_filter): 토큰화 전에 기호를 대체하거나 제거하거나 정규화합니다.
- 토크나이저(tokenizer): 토큰화 알고리즘을 선택합니다.
standard,ngram,edge_ngram,keyword,icu등의 유형을 지원하여 다양한 언어와 구조의 텍스트를 처리합니다. - 토큰 필터(token_filter):
lowercase,word_delimiter,ascii_folding등의 필터로 토큰화 결과를 정규화하고 다듬습니다.
-- Example: Define a custom analyzer
CREATE INVERTED INDEX ANALYZER IF NOT EXISTS keyword_lowercase
PROPERTIES (
"tokenizer" = "keyword",
"token_filter" = "asciifolding, lowercase"
);
-- Use the custom analyzer when creating a table
CREATE TABLE docs (
id BIGINT,
content TEXT,
INDEX idx_content (content) USING INVERTED PROPERTIES(
"analyzer" = "keyword_lowercase",
"support_phrase" = "true"
)
);
3. BM25 관련도 점수 산정(4.0+)
Doris는 텍스트 관련도를 계산하는 BM25 (Best Matching 25) 알고리즘을 구현하여 전문 검색에 순위 및 점수 산정 기능을 제공합니다.
BM25의 핵심 특징은 다음과 같습니다.
- 용어 빈도(TF), 역문서 빈도(IDF), 문서 길이를 기반으로 하는 확률 모델
- 짧은 텍스트와 긴 텍스트 모두에 안정적으로 적용
k1과b매개변수로 가중치 전략 조정 가능
SELECT id, title, score() AS relevance
FROM docs
WHERE content MATCH_ANY 'real-time OLAP analytics'
ORDER BY relevance DESC
LIMIT 10;
4. SEARCH 함수: 통합 쿼리 진입점(4.0+)
SEARCH() 함수는 텍스트 검색을 위한 통합 구문 진입점을 제공합니다. 여러 컬럼 검색과 불리언 논리 조합을 지원하여 복잡한 쿼리를 더 간결하게 표현할 수 있습니다.
SELECT id, title, score() AS relevance
FROM docs
WHERE SEARCH('title:Machine AND tags:ANY(database sql)')
ORDER BY relevance DESC
LIMIT 20;
빠른 시작
1단계: 역색인이 있는 테이블 생성
CREATE TABLE docs (
id BIGINT,
title STRING,
content STRING,
category STRING,
tags ARRAY<STRING>,
created_at DATETIME,
-- Text search indexes
INDEX idx_title(title) USING INVERTED PROPERTIES ("parser" = "chinese"),
INDEX idx_content(content) USING INVERTED PROPERTIES ("parser" = "chinese", "support_phrase" = "true"),
INDEX idx_category(category) USING INVERTED,
INDEX idx_tags(tags) USING INVERTED
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 10;
2단계: 텍스트 쿼리 실행
-- Simple keyword search
SELECT * FROM docs WHERE content MATCH_ANY 'apache doris';
-- Phrase search
SELECT * FROM docs WHERE content MATCH_PHRASE 'full-text search';
-- Boolean query with SEARCH
SELECT * FROM docs
WHERE SEARCH('title:apache AND (category:database OR tags:ANY(sql nosql))');
-- Relevance-based ranking
SELECT id, title, score() AS relevance
FROM docs
WHERE content MATCH_ANY 'real-time analytics OLAP'
ORDER BY relevance DESC
LIMIT 10;
하이브리드 검색: 텍스트 + 벡터
RAG 애플리케이션에서는 텍스트 검색과 벡터 유사도를 결합하여 더 포괄적인 검색을 수행할 수 있습니다.
-- Hybrid retrieval: semantic similarity + keyword filtering
SELECT id, title, score() AS text_relevance
FROM docs
WHERE
-- Vector filter for semantic similarity
cosine_distance(embedding, [0.1, 0.2, ...]) < 0.3
-- Text filter for keyword constraints
AND SEARCH('title:search AND content:engine AND category:technology')
ORDER BY text_relevance DESC
LIMIT 10;
역색인 관리
인덱스 생성
-- Create at table creation time
CREATE TABLE t (
content STRING,
INDEX idx(content) USING INVERTED PROPERTIES ("parser" = "chinese")
);
-- Create on an existing table
CREATE INDEX idx_content ON docs(content) USING INVERTED PROPERTIES ("parser" = "chinese");
-- Build the index for existing data
BUILD INDEX idx_content ON docs;
인덱스 삭제
DROP INDEX idx_content ON docs;
인덱스 조회
SHOW CREATE TABLE docs;
SHOW INDEX FROM docs;
추가 자료
핵심 문서
- 텍스트 검색 연산자: 전체 연산자 레퍼런스 및 쿼리 가속
- SEARCH 함수: 통합 쿼리 DSL 구문 및 예제
- 관련도 점수 산정: 관련도 순위 산정 알고리즘 및 사용법
고급 주제
- 사용자 정의 분석기: 도메인별 토크나이저 및 필터 구성
- 벡터 검색: 임베딩 벡터를 활용한 의미적 유사성 검색