본문으로 건너뛰기
최종 수정: 에

역색인(텍스트 검색)

텍스트 검색은 데이터 세트에서 특정 용어나 구문이 포함된 문서를 검색하고 관련도에 따라 결과의 순위를 매깁니다.

검색 방식강점적용 시나리오
텍스트 검색"정확하게 찾기": 제어와 설명이 가능한 정확한 매칭으로 키워드 일치와 필터 조건 충족을 확실하게 보장키워드 검색, 구문 매칭, 불리언 필터링
벡터 검색"폭넓게 찾기": 의미적 유사성을 활용하여 검색 범위를 확장의미 검색, 근사 매칭

생성형 AI 애플리케이션, 특히 검색 증강 생성(RAG) 시나리오에서 텍스트 검색과 벡터 검색은 서로를 보완합니다.

  • 의미적 포괄성과 어휘적 정밀성 사이의 균형 유지
  • 결과의 정확성과 설명 가능성을 보장하면서 재현율 향상
  • 두 방식을 함께 사용하여 대규모 언어 모델에 더 정확하고 관련성 높은 맥락을 제공하는 신뢰할 수 있는 검색 기반 구축
4.1.5부터 V1 역색인 생성 금지

새 인덱스에는 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;

SEARCH 함수 전체 가이드


빠른 시작​

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;

추가 자료​

핵심 문서​

고급 주제​