http://opensearchlab.otago.ac.nz/paper_10.pdf
해당 페이퍼는 es를 간단하게 훓는 페이퍼로 대략적인 개요정도만 담겨져 있었다.
Apache Lucene은 색인, 쿼리, 하이라이트, 언어 분석 등과 같은 일반적인 검색 및 검색 관련 작업을 수행하기 위한 애플리케이션 프로그래밍 인터페이스를 제공하는 오픈 소스 Java 기반 검색 라이브러리입니다.
Language Analysis
Lucene의 분석 기능은 색인할 문서나 검색할 쿼리 형태의 콘텐츠를 가져와 필요에 따라 사용할 수 있는 적절한 내부 표현으로 변환한다.
Lucene의 역 인덱스에 삽입되는 토큰을 생성하고, 쿼리 시에는 적절한 쿼리 표현을 형성하는 데 도움이 되는 토큰으로 변환한다.
분석 프로세스는 들어오는 콘텐츠에 대해 작동하기 위해 서로 연결되어 있는 세 가지 작업으로 구성된다.
- 선택적 문자 필터링 및 정규화(예: 발음 부호 제거)
- 토큰화
- 토큰 필터링(예: 어간, 중단어 제거, n-그램 생성).
Indexing and Storage
Lucene의 색인 및 저장 계층은 다음과 같은 주요 기능으로 구성된다.
- 사용자 정의 문서의 색인: 문서는 처리할 콘텐츠를 포함하는 하나 이상의 필드로 구성될 수 있으며, 각 필드는 앞서 설명한 분석 기능을 사용해 분석될 수도 있고 그렇지 않을 수도 있다.
- 사용자 정의 문서의 저장.
- 잠금 없는 인덱싱
- 실시간에 가까운 인덱싱으로 인덱싱이 완료되는 즉시 문서를 검색
- 병합 및 플러그 가능한 병합 정책을 통한 세그먼트 인덱싱
- 추가 및 롤백을 위한 트랜잭션 지원
- 다양한 채점 모델을 가능하게 하는 다양한 용어, 문서, 코퍼스 수준의 통계 지원
텍스트 분석
텍스트 분석 체인은 필드의 입력 데이터에서 토큰 스트림을 생성한다.
text analysis의 토큰은 'attributes'의 모음으로 표현되며, 토큰 값을 포함하는 예상되는 기본 “term” 속성 외에도 토큰 위치, 시작 및 종료 오프셋, 토큰 유형, 임의의 페이로드 데이터(현재 위치의 인덱스에 저장될 바이트 배열), 정수 플래그, 기타 사용자 정의 애플리케이션 정의 속성(예: 품사 태그) 등 토큰과 관련된 다른 많은 속성이 있을 수 있다.
text analysis은 문자 필터(예: 발음 부호 제거에 유용), 토큰 스트림의 소스인 토큰화기, 그리고 원래 토큰 스트림을 수정하는 일련의 토큰 필터로 구성된다.
Lucene은 총 5개의 문자 필터링 구현, 18개의 토큰화 전략, 97개의 토큰 필터링 구현을 포함하며 32개의 서로 다른 언어를 지원한다.
이러한 토큰 스트림은 패턴, 규칙 및 사전(예: 공백, 정규식, 중국어/일본어/한국어, ICU)에 의한 토큰화, 숫자 값과 날짜의 효율적인 색인화를 위한 특수 토큰 필터(트라이 기반 숫자 범위 검색 지원), 언어별 줄기 및 중지 단어 제거, 문자 또는 단어 수준의 n-그램 생성, 태깅(UIMA) 등과 같은 특정 기능을 수행한다.
indexing
Lucene은 역인덱스를 사용하며, 문서별로 반전되지 않은 인접 데이터를 유지하기 위한 추가 기능을 제공한다.
영구 데이터 모두 인덱스 데이터의 크기와 데이터 압축 비용에 영향을 주는 다양한 인코딩 스키마를 사용한다. Lucene은 데이터 코딩과 인덱스 데이터의 실제 저장(디렉터리 API)을 위해 플러그 가능한 메커니즘을 사용한다.
인덱스 부분의 총 수를 최소화하기 위해 주기적으로 더 큰 부분으로 병합되는 인덱스 확장(“세그먼트”라고 함)에 저장된다.
index update
색인은 검색과 동시에 새 문서를 추가하거나 기존 문서를 삭제하여 점진적으로 업데이트할 수 있다.
인덱스 확장은 인덱스의 기존 부분을 수정할 필요가 없는 점진적 인덱스 업데이트를 구현하는 일반적인 방법이다.
색인을 위해 새 문서가 제출되면 해당 필드는 이전 섹션에서 설명한 프로세스를 거치고, 그 결과 데이터는 압축된 인메모리을 사용해 '세그먼트'라는 새로운 인메모리 색인 확장에 축적된다.
이러한 인메모리 세그먼트는 구성 가능한 임계값(예: 총 문서 수 또는 세그먼트의 바이트 크기)에 도달할 때마다 주기적으로 영구 스토리지(코덱 및 디렉터리 추상화 사용)로 flush된다.
문서 삭제는 삭제할 문서를 선택(부울 일치 사용)하는 쿼리로 표현됩니다. 삭제는 또한 누적되어 플러시 전(아직 변경 가능한 상태일 때) 인메모리 세그먼트에 적용되며, 이미 플러시된 변경 불가능한 세그먼트를 읽을 때 해결할 수 있도록 커밋 포인트에 기록되며,
각 플러시 작업 또는 인덱스 압축은 2단계 커밋을 사용하여 전역 인덱스 구조에 기록되는 새로운 커밋 포인트를 생성한다.
인메모리 세그먼트에서 플러시되는 세그먼트 데이터는 구성된 코덱 구현을 사용하여 인코딩된다.
5.4.2 lucene 4.0 codecs
기본 코덱 구현(적절하게 “Lucene40”이라는 이름이 붙은)은 인덱스 크기(및 관련 I/O 탐색 비용)와 코딩 비용 간에 적절한 균형을 제공하기 위해 잘 알려진 압축 알고리즘과 전략의 조합을 사용한다.
예를 들어, 목록 데이터를 게시할 때는 델타 값의 가변 바이트 코딩, 다단계 스킵 목록, 문서 식별자의 자연스러운 순서, 문서 ID와 위치 데이터의 인터리빙을 사용하는 등 압축 해제 속도를 위해 바이트 정렬 코딩이 선호된다.
(Zipf’s 법칙에 따라) 자주 발생하는 매우 짧은 목록의 경우 코덱은 게시물을 용어 사전으로 인라인하는 “pulsing” 전략을 사용한다.
용어 사전은 용어 블록(고정 크기 또는 가변 크기) 및 스킵 목록별로 공유 접두사 델타를 사용하는 “block tree” 스키마를 사용하여 인코딩된다.
반전되지 않은 데이터는 다양한 전략을 사용하여 코딩되는데, 예를 들어 문서별로 강력하게 입력된 값은 고정 길이 비트 정렬 압축(프레임 코딩과 유사)을 사용하여 인코딩되는 반면, 일반 저장 필드 데이터는 압축을 전혀 사용하지 않는다.(물론 애플리케이션은 저장 전에 개별 값을 압축할 수 있음)
5.5.2 query evaluation
쿼리가 실행되면 효율성을 위해 각 반전된 인덱스 세그먼트가 순차적으로 처리되며, 각 인덱스 세그먼트에 대해 쿼리는 점수평가를 생성한다.
점수평가는 일반적으로 한 번에 한 문서(DAAT) 전략으로 문서에 점수를 매기지만, 일반적으로 사용되는 부울 점수평가는 용어 수가 적을 때 한 번에 한 용어(TAAT term-at-a-time)와 유사한 전략을 사용하기도 한다.
쿼리 트리에서 “leaf” 노드인 점수평가는 일반적으로 원시 인덱스 통계(예: 용어 빈도)를 용어 순위를 위한 구성 가능한 정책인 유사성에 전달하여 점수를 계산한다.
트리의 상위 점수평가는 일반적으로 하위 점수평가에 대해 작동한다. 예를 들어, 분리 점수평가는 하위 채점자의 점수 합계를 계산할 수 있
마지막으로, 수집기는 이러한 스코어를 실제로 소비하고 그 결과로 무언가를 하는 역할을 한다.(예: 상위 N개의 문서에 대한 우선순위 큐를 채우는 것)
5.5.3 similarity
유사도 클래스는 용어 및 글로벌 인덱스 통계는 물론 쿼리의 세부 사항(예: 구문의 용어 간 거리, 다중 용어 쿼리에서 일치하는 용어 수, 퍼지 용어의 레벤슈타인 편집 거리 등)을 고려하여 용어 및 쿼리 절의 점수를 매기는 정책을 구현한다.
Lucene 4는 추가 점수 모델을 지원하기 위해 여러 세그먼트별 통계(예: 총 용어 빈도, 고유 용어 수, 모든 용어의 총 문서 빈도 등)를 유지한다.
인덱싱 체인의 일부로서 이 클래스는 일반적으로 필드 길이와 임의의 사용자 지정 필드 부스트에 따라 달라지는 필드 정규화 계수(가중치)를 계산하는 일을 담당한다.
Lucene 4는 잘 알려진 점수 모델을 제공하는 여러 유사성 구현을 제공한다. 여러 가지 정규화, BM25, 정보 기반, 무작위성으로부터의 발산, 언어 모델링이 포함된 TF/IDF.
'Database > elastic search' 카테고리의 다른 글
2. elasticsearch indexing (1) | 2024.10.20 |
---|---|
1. Elasticsearch (0) | 2024.10.18 |