Apache Lucene 1 (Search Engine)
Apache Lucene 1
0. 실습 Git 주소
1. Lucene 검색엔진 개요
- 검색엔진은 비정형 데이터 검색에 최적화 되어 있다.
- 검색엔진은 다음과 같은 순서로 비정형 데이터를 검색한다.
- 문서수집: 검색하려는 대상을 수집
- 문서 정제: 수집된 비 정형 문서를 정형 데이터로 정제하고 가공한다.
- 문서 데이터 색인: 정제도니 문서를 빠르게 검색 가능한 구조로 저장한다.
- 문서검색: 문서 정보에서 검색어를 찾는다.
IR(Information Retrieval)정보검색 시스템
- IR(검색엔진)과 DB의 차이
- DBMS는 테이블의 특정 컬럼을 기준으로 색인을 생성하는데 기본적으로 컬럼이 가지고 있는 모든 데이터를 사용한다.
- 따라서 전체 컬럼을 색인하고 검색하면 검색 성능이 떨어질 수 밖에 없다.
- IR은 DB의 컬럼과 매핑되는 필드 값을 잘게 분해해 단어 형태로 만든 후 색인을 생성한다.
- 단어 형태로 필드에 저장하기 때문에 원하는 문서를 빠르게 찾을 수 있다.(역색인)
Lucene(루씬)
자바로 개발된 고성능 정보 검색 오픈 소스 라이브러리
- 특징
- 오픈소스
- 적은 시스템 메모리사용으로 대용량 데이터 효율적 처리
- 맞춤형 순위 모델
- 다양한 쿼리 유형 지원
- 정교한 검색을 지원
- 필드 별 정렬 지원
- 실시간 색인 및 검색을 지원
- 그룹화 및 검색 결과에서 검색 용어를 강조 할 수 있음
루씬은 텍스트만 처리 할 수 있으며, 주요 기능은 텍스트의 색인과 검색이다.
색인
색인이란 검색엔진의 구조에 맞게 데이터를 저장하는 행위이다. 데이터를 저장하는 과정을 색인이라 하고 색인을 하기 전 원본 데이터를 Document 도큐먼트라고 한다.
- 역색인
- Term이 Key가 되는 색인구조로, 페이지 중심의 데이터를 키워드 중심의 데이터 구조로 역으로 바꾸는 것.
- 역색인은 내부적으로 해시테이블이나 이진트리 자료 구조를 사용한다.
검색
사용자 질의에 적합한 도큐먼트를 색인해서 찾는 일
- 루씬 검색의 특징
- 가장 적합한 결과를 상위 노출
- 구문쿼리, 와일드카드 쿼리, 근접쿼리, 범위 쿼리등 다양한 검색 유형 제공
- 필드 검색 지원(ex. 제목, 저자의 필드 등)
- 어떠한 유형의 필드도 정렬이 가능하다.
- 다중 색인 검색을 지원한다.
- 동시 업데이트 및 검색 가능한 준 실시간 검색 제공
- 유연한 그룹핑, 강조처리, 조인 및 결과 그룹화 지원
- 검색 속도가 빠르고 메모리 효율일 좋을 뿐 아니라 오타 보정 자동완성 기능 제공
2. Apache Lucene Libary
핵심라이브러리
- core: 루씬의 핵심 라이브러리
- org.apache.lucene
- document : 루씬은 색인과 검색 시 도큐먼트라는 기본단위를 사용한다. 이 도큐먼트를 관리하는 라이브러리
- index : 색인에 접근하고 색인을 관리하는 라이브러리
- search : 검색을 위한 패키지
- org.apache.lucene
- analyzers-common : 다국어 지원 분석기
- analyzers-icu : 국제 유니코드 컴포넌트 통합 지원 분석기
- analyzers-kuromoji : 일본어 분석기
- analyzers-smartcn : 중국어 분석기
- classification : 분류 모델
- queries : 루씬 코어 라이브러리에 추가된 필터와 쿼리
핵심 클래스
- 색인 관련 클래스
- IndexWriter : 디렉터리에서 사용하는 파일을 만든다.
- addDocument(도큐먼트 생성, 추가), deleteDocument(도큐먼트 삭제), updateDocument(도큐먼트 수정) 메소드 제공
- Diretory : 루씬의 색인 저장 공간이다. 단순한 파일 리스트인데 메모리, DB, 파일 중 하나를 저장소로 사용한다.
- Analyzer : 텍스트분석기로 텍스트를 색인할 단위로 텀을 분리하고, 불용어 제거 등의 일을 한다.
- Document : 색인하고 검색하는 단위로 필드의 집합
- Field : 도큐먼트의 일부분으로 각각의 필드는 이름(Name), 타입(Type), 값(Value)를 가지고 있다. 값으로는 텍스트 또는 바이너리, 숫자가 올 수 있다.
- Term : 분석기에 의해 만들어진 텍스트로 표현된 단어. 검색의 기본단위이기도 하다.
- IndexWriter : 디렉터리에서 사용하는 파일을 만든다.
- 검색 관련 클래스
- IndexSearcher : 검색 과정에서 색인을 읽고 검색한다.
- Analyzer : 텍스트를 분석하낟. 질의어를 텀으로 변환해 역색인 구조를 조회하기 용이하게 한다.
- Query : 질의를 위한 클래스, 추상클래스이며, 다양한 질의 방법을 제공.
- 루씬의 색인 및 검색 과정 예시
- 필드를 가진 도큐먼트 생성
- IndexWriter객체를 만들고 도큐먼트를 addDocument()메소드를 사용해 색인에 추가
- QueryParser.parse()를 사용해 문자열에서 쿼리를 만든다.
- IndexSearcher를 생성하고 쿼리를 search()메소드에 전달한다.