루씬(Lucene)이란 자바로 만들어진 고성능 정보 검색 개발용 라이브러리로 색인(index)과 검색에만 집중한 기능을 지원한다.
원본 문서를 검색하기 좋은 형태로 변환하는 처리작업을 색인(indexing)이라고 하여, 처리과정을 거친 결과물 역시 색인(index)이라고 한다.
관련없는 데이터를 얼마나 정확하게 제거했는지 판단하는 정확도와 입력받은 데이터를 얼마나 빼먹지않고 찾아냈는지 판단하는 재현율을 기준으로 검색의 품질을 구현한다.
루씬의 검색 애플리케이션 구조는 아래처럼 검색 과정과 검색 대상 분석으로 나눌 수 있다.
검색 대상 > 검색 대상 텍스트 확보 > 문서 생성 > 문서 텍스트 분석 > 색인에 문서 추가
루씬은 내부적으로 수집에 관한 기능은 제공하지 않는다. 그래서 제 3자가 대상을 수집하여 전달해줌으로써 검색 대상 텍스트를 확보한다.
그리고 문서(document)를 생성한다. 문서는 루씬에서 사용하는 개별 단위로 여러개의 필드(field)로 구성되어 있다.
생성된 문서의 텍스트는 텍스트 분석기 토큰(token)으로 불리는 단위로 분리된다. 루씬 내에는 여러개의 텍스트 분석기가 있으며, 필요에 따라 직접 만들어 사용할 수도 있다.
위의 과정이 끝난 문서는 색인에 추가된다.
검색화면 인터페이스 > 검색 질의 생성 > 질의 실행 > 결과 출력
검색화면 인터페이스를 통해 검색어를 전달받고, 검색 엔진에서 인식하는 query 객체로 변환한다.
이론적인 검색 모델은 순수 불리언 모델과 벡터 공간 모델, 확률 모델 총 세 가지 모델이 있다.
순수 불리언 모델은 만들어진 질의에 따른 문서의 해당 여부를 판단한다. 별도의 점수 계산 부분은 없다.
벡터 공간 모델은 질의와 문서를 고차원 공간의 벡터로 표현하여, 거리를 계산해 문서와 질의 사이의 연관도나 유사도를 산출한다.
확률 모델은 확률적인 방법을 통해 개별 문서가 질의와 일치하는 확률을 계산한다.
루씬에서는 순수 불리언 모델과 벡터 공간 모델을 함께 사용하며, 필요의 경우 어떤 모델을 사용할 지 지정할 수 있다.
검색 과정에서의 다양한 설정 기능이 API로 준비되어 있다.
일반적으로 별도 서버에 웹 기반으로 구성된다.
IndexWriter 클래스는 색인 과정 중 가장 중심에 해당하는 클래스다.
색인을 새로 생성하거나 기존 색인을 열고 문서를 추가하거나 삭제, 변경하는 기능을 담당한다. 그러나 색인의 내용을 검색하거나, 꺼내볼 수는 없다.
Directorty는 루씬의 색인을 저장하는 공간이다.
추상 클래스이기 때문에 색인을 저장할 공간에 상속받아 필요한 메서드를 구현해야 한다.
다양한 종류의 Directorty가 있다.
Analyzer 클래스는 색인할 단어 단위로 분리하고 필요없는 단어를 제거하는 등의 역할을 담당한다.
텍스트를 색인하기 전 Analyzer를 거쳐 단어로 분리하는 과정을 거쳐야 한다.
Analyzer 클래스는 Directory와 함께 IndexWriter 클래스의 생성 메서드에 지정한다.
Analyzer 클래스 또한 추상 클래스로서 다양한 종류의 Analyzer가 있다.
Document 클래스는 개별 필드의 집합이다.
분석 단계에는 색인할 개별 필드가 필요하기 때문에, Document는 검색 결과 단위로서 하나 이상의 Field 객체를 담고 있다.
Field 객체에는 실제 색인할 대상인 텍스트가 담겨있다.
문서는 모두 이름이 지정된 개별 필드 2개 이상으로 구성되며, 각 필드는 Field라는 클래스로 표현한다.
// content 필드에서 leucene 단어를 포함하는 문서를 10개 가져오는 코드
Query q = new TermQuery(new Term("contents", "lucene"))
TopDocs hits = sercher.search(q, 10)
IndexSearcher 클래스는 색인을 담당하던 IndexWriter 클래스와는 다르게 검색을 담당한다.
여러 종류의 검색 메서드를 지원하고, 색인을 읽기 전용으로 열어 사용한다.
Term은 검색 과정을 구성하는 가장 기본적인 단위다.
필드 이름과 해당 필드에 속한 특정 단어의 쌍으로 이뤄진다. ([필드 이름]:[특정 단어])
Term 객체도 색인 과정에 관려하지만 Term 객체는 루씬 내부적으로 자동으로 생성된다.
검색 시점에서 Term 객체를 직접 생성해 TermQuery 질의를 사용할 수 있다.
Query 클래스는 가장 최소한의 공통 부분만 갖고있는 최상위 질의 클래스이다.
여러가지 도우미 메서드가 구현되어 있으며, Query 클래스를 상속받아 구현한 다양한 종류의 질의 클래스가 있다.
TermQuery 클래스는 루씬에서 지원하는 질의 중 가장 기본적인 기능을 가진다.
특정 필드에 원하는 단어가 들어있는 문서를 찾아낸다.
TopDocs 클래스는 검색 결과 중 최상위 N개의 문서에 대한 링크를 담는 결과 클래스다.
최상위 N개의 결과마다 각 문서의 정수형 doxID 값과 float 자료형의 점수를 담는다.
엘라스틱 서치(Elastic Search)란 루씬(Lucene)을 기반으로 개발된 오픈소스 검색 엔진이다.
ES는 NRT 검색 플랫폼이라는 특징을 가진다. 이 NRT는 Near Real Time의 약자로 문서를 색인화 하는 시점부터 문서가 검색 가능해지는 시점까지 약간의 대기 시간이 있긴 하~지만 거의 실시간에 가까운 속도로 색인된 데이터의 검색 및 집계가 가능하다~라는 뜻이다.
다시 정리하자면, 엘라스틱 서치는 루씬을 기반으로 방대한 양의 데이터를 신속하게 검색할 수 있는 분석 엔진이다!