[강좌]Lucene Index File Format-2

이번 강좌에서 설명할 파일구조는 Field의 정보에 대한 파일이다. 단순히 필드의 속성 및 이름 값을 루씬이 어떤식으로 접근하려고 하는지 확인해 보는 장이 될것이다.

5. 세그먼트당 포함된 파일들
세그먼트에 포함된 모든 파일들은 확장자에 의해 구분이 된다.

Fields

1)필드정보(Field Info) 저장파일
필드정보 저장파일은 .fnm이라는 확장자로 저장이 된다.

<구조 요약>
FieldInfos (.fnm) –> FieldsCount, <FieldName, FieldBits>^FieldsCount

<각 인자별 자료형 정의>
FieldsCount –> VInt

FieldName –> String

FieldBits –> Byte

필드의 속성 정보를 가지고 있는다.
가장 낮은 비트는 인덱싱 되어질 필드인지 아닌지에 대한 정보를 가지고 있다. (1 : 인덱싱) isIndexed?
두번째 낮은 비트는 텀벡터의 저장 여부를 알려준다. (1 : 텀벡터 저장)

Lucene 1.9 이상에서는 다른 정보들이 추가가 되어 진다.
세번째 낮은 비트가 0x04로 셋팅된다면, 텀 위치정보가 텀벡터와 함께 저장된다.
네번째 낮은 비트가 0x08로 셋팅되면, 텀 오프셋이 텀벡터와 함께 저장된다.
다섯번째 낮은 비트가 0x10으로 셋팅되면, 인덱싱되는 필드에서 norm을 생략하는 옵션이다.

.fnm파일은 세그먼트당 존재하는 필드의 정보를 가지고 있는 파일이며 나중에 나오는 필드번호(FieldNum)은 문서번호(Document Number)와 유사하게 세그먼트에 상대적이다. 그러니까 세그먼트당 카운트를 하고, merge작업시 번호 병합이 함께되는것이다. 하지만 문서상 FieldNum은 저장되지 않는걸로 나오고 필자의 판단으로는 메모리에 이 파일이 로딩된 다음에 모든 작업이 처리되기 때문에 (이 파일은 용량이 작다. 왜냐면 문서에서 100개나 1000개의 필드를 추출할 경우는 거의 없기 때문이다.) 바로 인덱스 번호(FieldNum)를 추출해 내는걸로 코드상 구현되어 있다.

2) 저장된 필드(Stored Fields)
필드값을 저장하는 구조는 두개의 파일로 구성되어 있다.(.fdx, .fdt)

1. 필드 인덱스 파일 또는 .fdx 파일
이 파일은 문서(Document)가 추가될때 마다 정보가 추가 된다 따라서 세그먼트 크기(Document의 갯수)만큼 쓰기가 행해진다.

<구조 요약>
FieldIndex (.fdx) –> <FieldValuesPosition>^SegSize

<각 인자별 자료형 정의>
FieldValuesPosition –> Uint64

8바이트의 자료형으로 정의되어 있기에 n의 값을 가지는 Document Number일때 n*8로 바로 해당 필드정보에 접근이 가능하다. (random access 가능함)
다시말해 .fdt에 나올 DocFieldData에 접근할 수 있는 포인터 이다.

2. 필드 데이터 파일 또는 .fdt 파일
이것은 각 문서마다의 필드값을 저장한다.

<구조 요약>
FieldData (.fdt) –> <DocFieldData>^SegSize

DocFieldData –> FieldCount, <FieldNum, Bits, Value>^FieldCount

<각 인자별 자료형 정의>
FieldCount –> VInt

FieldNum –> VInt

FieldCount는 한 문서에서 나올 수 있는 필드의 갯수를 의미하고, FieldNum은 FieldName에 따른 세그먼트내 고유한 값으로 유지가 된다.

Lucene 1.4 이하에서는

Bits –> Byte

Value –> String

Bits에서는 가장 낮은 비트만 쓰인다. 토근화 여부인데 토큰화를 하지 않는다면 value값 전체를 저장하고 토큰화를 한다면 analyzer로 분석해서 토큰을 저장하게 된다.(인덱싱을 하지만 토큰화를 안할 수도 있다. 예 – 키워드일 경우)

Lucene 1.9 이상에서는

Bits –> Byte
가장 낮은 비트는 위와같은 토큰화 여부를 저장한다.
두번째로 낮은 비트는 필드가 바이너리 데이터를 가지고 있는지 여부 저장
세번째 비트는 필드값의 압축여부를 저장한다.(ZLIB알고리즘 사용한다.)

Value –> String 또는 BinaryValue (Bits 정보에 의존함)

만일 BinaryValue라면
BinaryValue –> ValueSize, <Byte>^ValueSize

ValueSize –> VInt

여기까지 필드정보를 저장하는 부분을 분석해 보았다. 앞으로 텀사전(term dictionary)의 구성정보에 대해서 분석해볼 생각이다. 그래서 이곳에서 텀 사전과 연결되는 직접적인 부분은 Field의 Value 값으로 저장되는 부분이다. 이 Value값이 어떻게 저장되는지에 따른 정보는 Bits에 저장이 되고 나머지 텀의 정보는 텀 사전에 저장이 되기 때문이다.

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