Elastic Search

[Elasticsearch] Lucene 간단 정리

꾸준함. 2022. 6. 4. 20:15

Lucene

  • 오픈소스 기반 검색 라이브러리
  • 검색 엔진이 갖춰야 하는 기본 기능 제공
    • 검색
    • 색인
    • 형태소 분석

 

Lucene의 기본 개념

  • 인덱스 (Index)
  • 문서 (Document)
  • 필드 (Field)
  • 용어 (Term)

 

Field는 Term의 집합, Document는 Field의 집합, 그리고 Index는 Document의 집합

정리하자면, Lucene은 Term < Field < Document < Index와 같은 각 단위의 집합 구조를 가짐

 

* Lucene 기반의 대표적인 검색 엔진이 Elasticsearch와 Solr

 

역 색인 구조 (Inverted Index Structure)

  • 검색에서 사용되는 자료구조로 hashmap과 비슷함
  • 색인어에 대한 통계를 저장하는 구조
  • 용어에 대해서 문서를 나열하는 구조가 역 인덱스라고 하는 인덱스 계열

 

아래와 같이 세 개의 문장이 주어졌다고 가정해보면

  • hello everyone
  • this article is based on inverted index
  • which is hashmap like data structure

 

역 색인 구조는 아래와 같이 생성됩니다.

Term (단어) Frequency (발생 빈도) Documents (몇 번째 문장)
hello 1 1
everyone 1 1
ths 1 2
article 1 2
is 2 2, 3
based 1 2
on 1 2
inverted 1 2
index 1 2
which 1 3
hashmap 1 3
like 1 3
data 1 3
structure 1 3

 

위와 같이 역 색인 구조를 생성한 뒤 "I", "the", "we", "is", 그리고 "an"과 같은 필요 없는 단어는 제거하고 비슷한 단어들로부터 대표 단어를 추출하여 merge 작업을 진행하면 의미 있는 역 색인 구조를 생성할 수 있습니다.

예를 들자면, 단어가 catty, cats, 그리고 cat이 등장했을 때 대표적인 단어는 cat이므로 cat의 frequency를 3으로 기록할 수 있습니다.

 

역색인 구조가 검색에 반드시 필요한 구조이지만 아래와 같은 단점 또한 존재합니다.

  • 메모리를 많이 차지
  • update, delete, 그리고 insert 명령어 실행하는데 높은 부하 발생

 

색인

  • Lucene의 IndexWriter가 Index File들을 생성하는 과정
  • Segment File은 Index File의 유형 중 하나로 수정이 불가능한 Immutable Type
    • 여러 개로 생성된 Segments 파일들을 merge 후 하나의 색인 파일로 만드는 과정이 필요
    • 하나의 index는 하나의 IndexWriter로 구성
  • 색인 파일에는 문서의 Field, Field Data, Term, Frequencies, Position, 그리고 Deleted Documents와 같은 정보가 저장되고 색인과 검색할 때 활용이 됨

 

 

* lucene 프로젝트 내 TestIndexWriter.java 코드를 보면 위 과정을 확인할 수 있음

 

검색

  • 색인 후 Lucene의 IndexSearch로 검색하는 과정
  • IndexSearch는 IndexReader를 이용해서 검색 수행
    • 하나의 Index에는 Segment별로 N개의 LeafReader가 존재

 

IndexSearcher Pseudo Code

  • Query
  • IndexSearcher
    • IndexReader
    • IndexReaderContext
    • List<LeafReaderContext>
    • LeafSlices
      • search -> Query, CollectionManager
      • search -> LeafReaderContext, Collector
  • return TopFieldDocs

 

* lucene 프로젝트 내 IndexSearcher.java와 TestIndexSearcher.java 코드를 보면 위 과정을 확인할 수 있음

* 코드 중 제일 중요한 부분은 세그먼트 당 LeafReader가 존재하는 부분

 

형태소 분석

  • 입력받은 문자열에서 검색 가능한 정보 구조로 분석/분해하는 과정
  • 형태소 분석의 구성요소는 크게 4가지
    • Analyzer
    • CharFilter
    • Tokenizer
    • TokenFilter
  • 이 중 Analyzer가 형태소 분석을 위한 최상위 클래스
    • Analyzer는 하나의 Tokenizer와 다수의 Filter로 구성

 

* lucene 프로젝트 내 Analyzer.java 코드를 보면 위 과정을 확인할 수 있음

 

정리

  • Lucene을 이용해서 다양한 Text 분석 앱을 만들 수 있음
  • Lucene의 Index 즉, Segement 파일은 Immutable
  • Lucene의 핵심 클래스는 IndexWriter, IndexSearcher, 그리고 Analyzer
    • 그렇기 때문에 색인, 검색, 형태소 분석을 간단히 정리

 

비고

Q. Lucene을 이용하면 Near Real Time 검색이 가능한 이유

A. 가장 최근에 색인 작업을 한 IndexWriter를 기반으로 IndexReader를 얻어와 IndexSearch가 검색을 수행하기 때문에 준실시간 검색이 가능

 

참고

패스트캠퍼스 - The RED: 검색엔진 구축을 위한 Elasticsearch 마스터 클래스 by 정호욱

반응형