← 학습 카테고리

Learn

Elasticsearch

50개 모듈 · 현재 34번째

Elasticsearch 모듈 34/50 elasticsearch-learn-34

Highlighting — 검색 결과에서 매칭된 부분을 표시하는 세 가지 방식

Elasticsearch Circuit Breaker 및 Highlighting 공식 문서 종합 (웹 리서치, 2026) — Elastic 공식 문서(circuit-breaker-settings, highlighting, how-es-highlighters-work-internally) Elastic 공식문서 Highlighting, How highlighters work internally

이 모듈을 다 읽으면

  • plain/fvh/unified 세 하이라이터가 무엇을 입력으로 요구하고 어떤 트레이드오프를 갖는지 설명할 수 있다
  • 기본 하이라이터인 unified가 문장 경계를 이용해 조각(fragment)을 나누는 방식을 설명할 수 있다

elasticsearch-learn-02에서 다룬 역인덱스·용어(term) 매칭을 전제로, 검색 결과에서 실제로 어느 부분이 매칭됐는지를 사용자에게 보여주는 하이라이팅 기능의 세 가지 구현 방식을 정리한다.

plain — 가장 단순하지만 조각이 어색하게 잘릴 수 있다

plain 하이라이터는 저장된 필드 값이 아니라 지정된 analyzer로 텍스트를 다시 분석해 토큰 스트림을 만든 뒤, 이를 훑으면서 fragment_size에 도달할 때마다 조각을 끊는 단순한 알고리즘을 쓴다. 이 방식은 구두점이나 어색한 위치에서 조각이 잘릴 수 있다는 단점이 있다 — 문장 경계를 인식하지 못하고 순전히 오프셋 길이만으로 자르기 때문이다.

핵심 포인트

  • plain: 텍스트를 analyzer로 재분석해 토큰 스트림 생성 후 fragment_size 도달 시마다 단순히 끊음
  • 문장 경계를 인식 못 해 구두점 등 어색한 위치에서 조각이 잘릴 수 있음

fvh — 정확한 매칭 횟수 기반 점수, 사전 term_vector 필요

fvh(fast vector highlighter)는 Lucene의 fast vector highlighter를 쓰는데, 매핑에서 term_vector를 with_positions_offsets로 설정한 필드에만 쓸 수 있다. 각 조각(fragment)의 점수를 그 안에 등장하는 쿼리 용어 개수로 매기는데, plain과 달리 고유 용어가 아니라 등장한 용어 전부(중복 포함)를 센다는 차이가 있다.

핵심 포인트

  • fvh: term_vector=with_positions_offsets가 매핑에 미리 설정된 필드에만 사용 가능(사전 준비 필요)
  • 조각 점수 산정 시 고유 용어가 아니라 등장한 쿼리 용어 전부(중복 포함)를 셈 — plain과의 차이

unified — 기본값, BM25로 문장을 채점하고 사전 색인 정보를 재활용한다

unified 하이라이터는 Lucene의 Unified Highlighter를 써서 텍스트를 문장 단위로 나누고, 마치 그 문장들이 각각 하나의 문서인 것처럼 elasticsearch-learn-02에서 다룬 BM25 알고리즘으로 점수를 매긴다. 정확한 구문(phrase) 매칭과 fuzzy/prefix/regex 같은 multi-term 매칭까지 정밀하게 하이라이트할 수 있고, 이미 색인에 저장된 term vector나 term offset이 있으면 그걸 재활용하며, 없으면 그때그때 텍스트로부터 임시 인메모리 인덱스를 만들어 처리한다. unified와 fvh는 둘 다 Java의 BreakIterator를 이용해 조각을 실제 문장 경계에 맞춰 나누므로, plain보다 훨씬 자연스러운 조각을 만든다.

핵심 포인트

  • unified(기본값): 텍스트를 문장 단위로 나눠 BM25로 채점, 정확한 구문·multi-term 매칭 하이라이트 지원
  • 이미 색인된 term vector/offset이 있으면 재활용, 없으면 즉석에서 임시 인메모리 인덱스 생성 — unified/fvh는 BreakIterator로 실제 문장 경계에 맞춰 조각을 나눠 plain보다 자연스러움