Lucene

최강일·2022년 5월 5일
0

Elasticsearch

목록 보기
2/4

루씬이란?

자바 기반 IR 오픈소스 라이브러리. 색인과 검색이라는 핵심 기능 지원
우리는 Text와 Analyzer를 Lucene에 제시하면 Lucene이 Index를 구성 -> 효율적인 Full Text검색

IR : Information retrieval, 고성능 정보 검색

1)색인

  • 역색인 구조에 맞게 저장하는 행위 또는 결과물을 지칭
  • 색인 절차
    • 텍스트 추출하여 루씬 도큐먼트 생성
    • 형태소 분석 : 필드에 지정된 텍스트를 색인 내부에서 사용하는 가장 기본적인 단위인 term으로 분리하는 작업
      • 단어 분리
      • 특수문자 제거
      • 모든 문자를 대/소 문자로 변경
      • 불용어 제거 등등
    • 색인에 추가

역색인 : <Term,Doc 정보> 형태
Document : 색인,검색에 사용되는 가장 기본적인 단위. RDB의 row
Term : 텍스트를 쪼개고 불필요한 조사등을 거른 검색의 기본 단위
색인 > 도큐먼트 > 필드 > 텀

2)검색

  • 루씬 쿼리를 통해 도큐먼트를 찾는 일. 적합도에 따른 정렬
  • 질의어에서 Term을 추출하여 Term 검색

flush : 색인 대상 도큐먼트를 버퍼링 후, 물리적인 세그먼트로 옮기는 것
commit 이후웨 검색 가능

DocValues

숫자나 범위 검색, 집계, 그루핑 검색에 사용되는 구조
JVM Heap 메모리 사용이 아닌 os의 파일 시스템 캐시 사용

Segment

루씬의 색인은 물리적으로 세그먼트로 구성. 색인은 하나 이상의 세그먼트의 집합.
세그먼트 안에는 다수의 도큐먼트가 저장

특징

  • 불변
    • 신규 도큐먼트 추가, 기존 도큐먼트 변경은 직접 수정하는게 아니라 새로운 세그먼트를 생성해 수정사항을 반영하고, 기존 세그먼트를 삭제한다.
      삭제 또한 삭제할 도큐먼트로 표시하고 검색에 노출되지 않게 한다. 추가,수정,삭제가 지속적으로 일어난다면 용량,세그먼트 수가 늘어나 성능이 악화
  • 주기적으로 병합
    • 세그먼트를 주기적으로 병합하여 세그먼트 수를 줄이고, 삭제 표시한 도큐먼트는 병합 시 실제로 삭제. 병합으로 세그먼트의 크기는 점점 커짐
    • 많은 디스크 I/O와 리소스들을 많이 소모함으로 적절한 세그먼트 병합 정책이 필요

merge 팁

  • 기준 수치를 지정하 넘으면 병합, 세그먼트 용량, 도큐먼트 수 등등의 정책으로 진행.
  • 작으면 : 병합이 자주 수행됨 → 검색 속도 ↑ / 자원 및 시간 소모 ↑
  • 크면 : 병합이 적게 발생함 → 색인 빈도 ↓ / 검색 성능 ↓

마치며

루씬을 통해 색인,검색을하여 어떤 데이터를 어떻게 색인할지, 어떤 Analyzer를 쓸지, 어떤 쿼리를 날릴지, 정렬 등과 같은 비즈니스 로직?에 집중하면 될 것 같다.

profile
Search & Backend Engineer

0개의 댓글