개발자의 스터디 노트
루씬이 먼가요? 본문
루씬은 자바로 개발된 고성능 정보검색 오픈소스 라이브러리 입니다. 1999년 하둡개발자로 잘 알려진 더그 커팅이 개발했고 2005년 아파치 톱 레벨 프로젝트로 승격됐습니다. 가장 유명한 무료 자바 IR 라이브러리 입니다.
IR이란?
- Information Retrieval의 약자로, 사용자가 필요로 하는 정보를 수집하고 내용을 분석한 후 찾기 쉬운 구조로 만든 뒤 사용자 질의에 미리 만들어진 데이터에서 특정 정보를 찾아 제공하는 시스템 입니다. IR은 관리하는 모든 정보를 효율적으로 검색하도록 데이터 구조, 즉 색인을 만들고 관리합니다. 색인은 최단 시간에 필요한 정보의 위치를 찾도록 돕습니다.
루씬의 장점
- 오픈소스
- 적은 시스템 메모리 사용으로 대량의 데이터를 효율적으로 처리
- 맞춤형 순위모델
- 다양한 쿼리 유형 지원
- 정교한 검색 지원
- 필드별 정렬 지원
- 실시간 색인 및 검색 지원
- 그룹화 및 검색 결과에서 검색 용어 강조
루씬이 제공하는 두 가지 핵심 기능
1. 색인
- 색인이란 검색엔진의 구조에 맞게 데이터를 저장하는 행위로, 그 결과물(데이터)도 색인이라고 합니다. 인덱스(Index)라고 부릅니다.
- 역색인
역색인은 텀(Term)이 키(Key)가 되는 색인 구조입니다. 즉, 역색인이란 페이지 중심의 데이터를 키워드 중심의 데이터 구조로 역으로 바꾸는것이라고 할 수 있습니다.
도큐먼트 위치 | 원본 도큐먼트 |
1 페이지 | 춘천의 옛길인 수레너미 고개를 넘어 서면으로 이어지는 이 길은 춘천의 역사와 만나는 길이다. |
2 페이지 | 이곳은 춘천의 상징인 호수와 소양강 처녀상, 공지천 등을 만나며 산책로를 중심으로 가볍게 걸을 수 있다. |
3 페이지 | 춘천의 아름다운 자연과 사람들을 잊지못해 아쉬운 눈물을 흘렸다고 한다. |
4 페이지 | ….. |
텍스트 분석기를 통해 데이터를 공백 단위로 쪼갠 결과는 다음과 같습니다.
춘천, 옛, 길, 수레너미, 고개, 넘, 서면, 이어지, 이, 길, 춘천, 역사, 만나, 길
이런식으로 텍스트를 분석한 결과는 아래와 같습니다.
도큐먼트 위치 | 원본 도큐먼트 |
1 페이지 | 춘천, 옛, 길, 수레너미, 고개, 넘, 서면, 이어지, 이, 길, 춘천, 역사, 만나, 길 |
2 페이지 | 이곳, 춘천, 상징, 호수, 소양, 강, 처녀, 공지, 천, 등, 만나, 산택, 로, 중심, 가볍, 걷, 수, 있 |
3 페이지 | 춘천, 아름답, 자연, 사람, 잊, 못하, 아쉽, 눈, 물, 흘리, 하 |
4 페이지 | ….. |
위와 같이 저장되어 있는 구조를 정방향 색인 구조이고 역방향 색인구조로 데이터를 저장하면 아래와 같이 저장 할 수 있습니다.
Term | 도큐먼트 위치 |
강 | 1, 34, 75, 86, 97 |
걷 | 2, 405, 507, 700 |
고개 | 1, 568, 677, 898 |
공지 | 2, 25, 76, 89, 102 |
길 | 1, 6, 9, 87, 450, 600, 507 |
눈 | 3, 6, 7, 68, 336, 876 |
……. | |
춘천 | 1, 2, 3, 8, 90 |
호수 | 2, 107, 765, 970 |
이 역색인 구조에서 '호수'를 찾으면 2, 107, 765, 970 페이지만 검색하면 됩니다. 정방향 구조는 1000페이지를 모두 검색해야 하지만 역색인 구조는 단 4번만 조회하면 호수가 들어간 모든 페이지를 찾을 수 있습니다. 역색인은 내부적으로 해시 테이블이나 이진 트리 자료구조를 사용합니다. 텀뿐 아니라 도큐먼트의 단어 위치같은 메타 데이터도 가지고 있습니다.
루씬 색인의 특징
- 우수한 확장성과 고성능의 색인
- 현대적 하드웨어에서 시간당 150GB이상 처리 가능
- 작은 메모리 사용량 - 1MB 힙 메모리 요구
- 색인이 늘어나도 배치 색인만큼 빠른 색인 가능
- 텍스트 색인 시 색인 파일의 용량은 텍스트의 20 ~ 30% 수준
루씬 검색의 특징
- 가장 적합한 결과를 상위에 반환하는 순위 검색 지원
- 풍부하고 강력한 검색어 유형 제공(구문 쿼리(Pharse Queries), 와일드 카드 쿼리(Wildcard Queries), 근접 쿼리(Proximity Queries), 범위 쿼리(Range Queries) 등..)
- 필드 검색 지원(예: 제목, 저자의 필드 등)
- 어떠한 유형의 필드도 정렬(Sorting) 가능
- 다중 색인 검색 지원
- 동시 업데이트 및 검색 가능한 준 실시간 검색 제공
- 유연한 그룹핑, 강조 표시, 조인 및 결과 그룹화 지원
- 검색 속도가 빠르고 메모리 효율이 좋을 뿐 아니라 오타를 보정하는 자동완성 기능 제공
- 벡터 공간 모델 및 Okapi BM25를 포함한 플러그인 형태의 검색 스코어링(Scoring) 모델 지원
* Okapi BM25란?
- 주어진 검색 쿼리에 대한 문서의 관련성을 추정하기 위해 검색 엔진에서 사용하는 순위 기능입니다. 이것은 Stephen E. Robertson, Karen Spack Jones 등 이 1970년대와 1980년대에 개발 한 확률적 검색 프레임워크를 기반으로 합니다.
TF-IDF와 유사한 검색 기능을 나타냅니다.
https://en.wikipedia.org/wiki/Okapi_BM25