[강좌] Lucene Index File Format Overview

뭐 이번에 루씬(Lucene) 파일시스템을 분석할 일이 생겼다. 물론 일적으로 하는것이고 전에 한번 쭉 봐서 그런지 이젠 뭔가가 보이기 시작하는군. 역시 100번 읽으면 뭐든지 이해가 되는거 같다(讀書百遍意自見).
그냥 어제 문서를 보면서 간단하게 정리를 할 필요가 있다는 생각이 들어서 한번 이곳에 정리해 본다.

1.개요
루씬(Lucene)은 세그먼트라는걸 유지한다. 뭐 sub-index라고 이해해도 될것이다. 이런 세그먼트들이 모여서 하나의 큰 인덱스로 발전(merge작업을 통해)을 하게되는데 이런 세그먼트를 기본 단위로 루씬 파일 시스템은 설명이 된다.

그리고 각 문서(Document)는 문서번호(Document number)를 가지고 있음으로 접근이 가능한데 그 번호 자체는 세그먼트당 유일한 번호로 유지된다. 따라서 각 세그먼트는 base number를 유지함으로 merge시 base number를 기준으로 절대번호를 계산해 낸다.
만약에 지워야 될 문서가 있다면 한번에 merge작업시 실제로 지우고 그 전까지는 특정 비트로 표시만 해둔다.

앞으로 내용중에 중요한 내용은…

1. 문서(document)는 필드(field)의 연속이다.
2. 필드(filed)는 텀을 값으로 하는 명명된 구조를 가진다. 예) {“fieldname”:”term value”})
3. 텀(term)은 문자열이다.

필드의 종류

Keyword : 분석기로 분석하지는 않지만 검색 가능하며 본문도 저장된다.(날짜, url등이 쓰일수 있다.)
UnIndexed : 분석기로 분석하지 않고 검색도 불가능하다. 본문의 요약문을 작성할 때 쓰일 수 있다.
UnStored : UnIndexed와 반대 분석기로 분석하고 검색도 가능하지만 색인에 본문이 저장되지 않는다.
Text : 분석기로 분석되며 색인된다.

뭐 이정도만 되면 오버뷰하는데 문제가 없을듯 하다.

2.Overview
각 세그먼트 인덱스에 포함되는것들.

Field names(필드명).인덱스에서 사용되는 필드명 셋을 포함한다.

Stored Field Value(저장된 필드 값). 각 문서에서 이것은 속성-값 쌍의 리스트를 포함한다.여기서 속성은 필드명이다. 이것들은 문서에 대한 보조 정보를 저장하는데 사용된다,예를 들어 title, url 또는 데이터베이스에 접근하기 위한 정보들이다. 저장된 필드값의 집합은 검색시 각 hit를 위해 리턴되는 것들이다. 이것은 문서번호로 맞추어 진다.

Term Dictionary(텀사전). 모든 문서의 인덱스된 필드에서 사용되는 모든 텀을 포함하는 사전. 사전은 또한 해당 텀을 포함하고 있는 문서의 갯수를 저장한다, 그리고 텀빈도와 근접데이터로의 포인터 역시 저장하고 있다.

Term Frequency data(텀빈도 데이터). 사전에 있는 각 텀에 대해서, 텀을 포함하고 있는 모든 문서의 갯수와 문서에서의 빈도수를 저장한다.

Term Proximity data(텀 접근 데이터). 사전에 있는 각 텀에 대해서, 각 문서안에서 텀이 나타나는 위치를 저장한다. (요약 정보를 추출할때 쓰기 위함일거 같음.)

Normalization factor(정규화 인자).각 문서안에서의 각 필드 마다 저장된 값으로, 필드에 대한 hit를 구하기 위해 곱해지는 값이다.

Term Vector(텀 벡터).각 문서의 각 필드에서, 텀벡터(때로는 도큐먼트 벡터라고도 불리운다.)가 저장된다. 텀벡터는 텀 문자(방향)와 텀 빈도수(크기)로 구성된다.(방향과 크기로 이루어진 벡터이다.)

Deleted documents(삭제된 문서). 어떤 문서가 삭제되었는지 알려주는 옵션파일.

3. 데이터 타입들
Byte. 8비트. 모든 데이터 타입들은 바이트의 배열로 이루어짐

UInt32. 4바이트로 이루어짐, 상위 바이트가 먼저 나옴 (빅 엔디안) (소스에서는 writeInt라는 메서드로 정의됨)

UInt64. 8바이트로 이루어짐,역시 빅 엔디안 형식으로 저장됨 (writeLong라는 메서드로 정의되어 있음)

VInt. 각 바이트의 상위 1비트가 더 많은 읽어야 될 바이트가 있는지 없는지 명시하고 나머지 7비트가 숫자값으로 계산되는 자료타입. 그래서 127까지는 1바이트에 저장되고, 16,383까지는 2바이트에 저장된다. (더 많은 설명은 여기로)

Chars. UTF-8 스타일로 저장을 한다.

String. VInt, Chars 쌍으로 표현을 한다. (VInt는 길이정보, Chars는 문자열)

ps) 뭐 여기까지 대충 정리를 해보았고, 다음 포스팅에서는 인덱스 파일당 무엇이 포함되어 있는지 살펴보겠다.
참고한 문서는 Lucene in Action, Lucene Index File Format이 되겠고, 무엇보다 Lucene in Action이라는 책이 빠르게 Lucene에 접근하기위해 많은 도움을 준거 같다.

CC BY-NC 4.0 [강좌] Lucene Index File Format Overview by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.