Lucene 색인 세그먼트

JunMyung Lee·2021년 6월 3일
0

루씬

목록 보기
4/4

세그먼트란?

루씬의 대표적인 자료구조 중 하나. 각 세그먼트는 그 자체로 개별적인 색인이며, 전체 색인에 들어있는 문서 중 일정량을 담고 있다. IndexerWriter에서 추가하거나 삭제한 문서를 버퍼에 쌓아 두고 있다가 flush하면 새로운 세그먼트가 생성된다. 그리고 검색할 때는 각 세그먼트를 하나씩 조회한 후 결과를 하나로 합쳐 전달한다.
하나의 세그먼트는 여러 종류의 파일로 구성되며, 각 파일은 모두 _X의 형태로 되어있다.

테스트 색인 이후 생성된 세그먼트 파일

segments_N이라는 파일은 모든 세그먼트에 대한 참조를 보관하고 있다. 색인에 대한 변경사항이 반영될 때마다 하나씩 증가하는 정수값을 가지고 있다.

세그먼트를 구성하는 파일마다 각자의 역할이 있다. (term vector를 담는 파일, 저장된 필드를 담는파일, 역파일 색인을 담고 있는 파일 등등)
통합 색인 형식을 사용하고 있다면, 세그먼트의 모든 파일이 _X.cfs 파일 안에 깔끔하게 들어간다. ( 루씬의 기본 설정은 통합 색인 형식이며, 변경시 IndexerWriter.setUseCompoundFile에서 설정 변경)
통합색인 형식을 사용하면 물리적으로 세그먼트마다 하나의 파일만 사용하기 때문에 검색과 색인 성능에 약간의 영향이 있을 수 있으나, 운영체제 차원에서는 파일 개방 개수를 줄이는 효과가 있다.

시간이 지나고 색인을 사용할수록 자연적으로 더 많은 세그먼트가 생성되고, 특히 IndexWriter 클래스를 자주 사용하면 세그먼트의 개수가 빠르게 늘어나지만, IndexerWriter 클래스가 주기적으로 세그먼트 몇 개를 선택해 하나의 새로운 세그먼트로 병합하고, 병합된 기존 세그먼트는 삭제한다.
병합할 세그먼트는 MergePolicy 클래스를 따라 선택되고, 병합 대상 세그먼트는 MergeScheduler 클래스에 따라 지정된 시점에 병합된다.

profile
11년차 검색개발자 입니다. 여러 지식과 함께 실제 서비스를 운영 하면서 발생한 이슈에 대해서 정리하고 공유하고자 합니다.

0개의 댓글