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 정호욱
'Elastic Search' 카테고리의 다른 글
[Elasticsearch] 매핑과 인덱스 alias, template (1) | 2024.06.06 |
---|---|
[Elasticsearch] 데이터 모델링 기초 (0) | 2024.06.06 |
[Elasticsearch] 개념과 용어 정리 (1) | 2024.06.02 |
[Elasticsearch] 설정 관련 정리 (0) | 2022.11.16 |
[Elasticsearch] Components 정리 (5) | 2022.10.12 |