목요일, 4월 18
Shadow

#019 루씬 색인 소개

다루는 내용

기본적인 색인 작업
필드 중요도 지정
날짜 숫자 필드 정렬
고극 색인 기법

루씬은 해당 문서를 색인 할때 마다 루씬의 필드와 내용을 어떻게 처리 할것인가 하는 조정이 존재한다. 색인을 하려면 먼저 해당 원본을 루씬의 문서와 필드 구조로 변환해야 한다.
예를 들어 사용자가 title:lucene라는 검색을 하면 title의 lucene를 찾는 다는 뜻이다.

문서를 색인하는데 있어 크게 3가지 종류의 옵션을 사용할수 있다.

1. 필드의 내용을 색인 할 것인지 하지 않을 것인지. 
2. 필드의 내용을 색인 할 경우 텀 백터를 저장할 것인지 아닌지. 
3. 색인 여부와 관계 없이 필드의 내용을 저장 할 것인지.

또한 유연한 스키마 구조를 가지고 있기 때문에 스키마리스 구조로 루씬을 만든다면 각각의 데이터에 맞춰서 자동으로 스키마의 필드가 생성되며, 하나의 문서에 여러개의 서로 다른 필드가 추출될수 있으며, 비정규화된 데이터를 xml, json등의 형태로 변경하여 결과를 리턴 받을수 있는 구조로 만들수 있다.

다음으로는 텍스트 추출과 문서 생성과정을 보면 크게 루씬의 색인 절차는 3가지 형태로 분류 할수 있다.

1. 텍스트를 추출한다. 
2. 텍스트를 분석한다. 
3. 텍스트를 색인에 추가한다. 

색인 작업을 진핼 할 때 가장 먼저 원본 문서의 파일에서 텍스트를 뽑아내고 루씬의 필드 객체를 만들어 최종적으로는 document객체에 생성하고, 텍스트 분석 절차를 거쳐 일련의 토큰 스트림을 반환한다. 그리고 마지막으로 세그먼트 구조의 색인에 토큰을 하나씩 추가한다.

루씬은 실제로 색인 할 수있는 언어가 텍스트로된 내용을 읽어드릴수 있다. 만약 pdf, image등의 파일을 색인에 추가 하고 싶다면 다른 플러그인 들을 붙여서 텍스트(binary)로 변경하여 추출 해 주어야 한다.
텍스트를 추출 하려면 Doucment클래스를 객체를 생성한다. 추출한 텍스트는 Field객체에 내용을 담고 Docuemt객체를 생성해 추가하고 나면 IndexWriter객체의 addDocument메소드를 호출해 루씬이 색인하게 문서를 넘겨준다.

addDocument메소드를 호출하면, 루씬은 Docuemnt객체에 포함된 텍스트를 모두 일련의 토큰으로 분류 하고 설정에 따라 몇가지 추가 작업을 진행한다.
몇가지 추가 작업은 필터를 통해 대소문자 변경, 문자 치환, 동의어처리, 불용어 처리등을 한다.

입력된 텍스트를 모두 분석하면, 토큰을 색인에 추가한다. 루씬은 입력된 텍스트를 토큰으로 변환해 역파일 색인이라는 구조에 저장한다. 역파일 색인은 원하는 검색어를 빠르게 조회할 수 있으면 디스크 공간을 효율적으로 사용하는 장점이 있다.
루씬 색인은 항상 하나 또는 그 이상의 세그먼트로 구성된다. 전체 색인에 들어있는 문서중 일정량을 담고 있다. IndexWriter에서 추가하거나, 삭제한 문서를 버퍼에 쌓아 두고 있다가 플래시 하면 새로운 새그먼트가 생성된다.
하나의 세그먼트는 역시 여러 종류의 파일로 구성되며, 각파일은 모두 _세그먼트이름.확장자의 형태로 이름이 붙여진다. 그리고 각 파일에 담당하는 기능에 따라 확장자를 지정한다. 그리고 segments_이라는 이름의 특별한 세그먼트 파일이 있으며, 여기에는 해당 색인을 구성하는 모든 세그먼트에 대한 참조를 보관하고 있다. 은 흔히 generation이라 부르며, 색인에 변경사항이 반영될 때 마다 하나씩 증가하는 정수 값이다.
시간이 지나고 색인을 사용할수록 자연적으로 점점더 많은 세그먼트가 생성되고, 특해 indexWriter클래스를 자주 사용하면 세그먼트의 개수가 빠르게 늘어난다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.