[Lucene] 1장. 루씬의 이해
Lucene 기초 다지기
출처 : 실전비급 아파치 루씬 7: 엘라스틱서치 검색 엔진을 향한 첫걸음
목차
루씬의 이해
1. 루씬이란
1) 정보 검색
- 정보 검색 : 정보의 집합으로부터 원하는 내용을 얻는 행위
- 정보 집합 : 정형이나 비정형 구조의 정보 모음
- 비정형 데이터는 나날이 증가하고, 정보 검색에 대한 사용자 요구도 다양해지면서…
- 전통적인 데이터베이스로는 이런 변화와 요구를 더 이상 감당할 수 없게 되었다!
2) 검색 엔진
-
검색 엔진 : 컴퓨터 시스템에 저장된 정보를 찾아 답하는 정보 검색 시스템
- 문서 수집 : 검색하려는 대상 수집하기
- 문서 정제 : 수집된 비정형 문서를 정형 데이터로 정제하고 가공
- 문서 데이터 색인 : 정제된 문서를 빠르게 검색 가능한 구조로 저장
- 문서 검색 : 문서 정보에서 검색어 찾기
-
DB의 한계 극복
- 최근 많은 기업이 일반적인 검색을 목적으로 DB 대신 검색 엔진을 도입하기 시작함!
- 쉽게 도입할 수 있도록 패키징된 오픈소스 검색 엔진 (
Elasticsearch
,Solr
)의 등장이 컸음!
-
IR 시스템 : 정보 검색 (Infomation Retrieval, IR)
- 사용자가 필요로 하는 정보를 수집하고, 내용을 분석한 후 찾기 쉬운 구조로 조직한다.
- 사용자 질의에 미리 조작하고 정의한 데이터 에서 특정 정보를 찾아 제공한다.
-
IR의 DBMS 비교하기
-
공통점 : 색인을 생성하고 정보 검색에 활용한다.
-
차이점 : 색인을 구성하는 방법과 색인 자체에 필요한 정보만 담겨있는지 여부가 다르다!
-
색인 구성 방법
- DBMS
- 테이블의 특정 컬럼 을 기준으로 색인을 생성하고, 컬럼이 갖고 있는 데이터를 사용한다.
- 아이디나 번호같이 짧은 값을 가진 컬럼을 기준으로 색인을 생성한다.
- IR
- DB의 컬럼과 매핑되는 필드 값을 잘게 분해해 단어 형태로 만든 후 색인 생성
- 내용이 긴 컬럼이라도 단어 형태 로 필드에 저장해 원하는 문서를 빠르게 찾음
- DBMS
-
원본 데이터 여부
- DBMS : 인덱스에 실제 데이터가 저장된 위치 정보 만 가지고 있다.
- 따라서 원본 데이터가 필요하면 저장된 DB 테이블을 읽어야 한다
- IR : 원하면 색인 생성 시 필드의 내용까지 저장할 수 있다
- DBMS : 인덱스에 실제 데이터가 저장된 위치 정보 만 가지고 있다.
-
검색 방법
- DBMS : 특정 단어 검색 시, 전체 컬럼 정보를 하나씩 비교하며 조회해야 한다.
- IR : 미리 정의된 색인에서 조회하면 된다.
-
-
이 둘을 같이 사용하면 성능상 큰 이점을 얻을 수 있다.
원본 데이터인 DB를 IR로 색인 하고 사용자의 검색 요청에 일차적으로 답하고,
사용자가 상세 내용을 요구할 때만 DB 테이블을 조회 하는 식의 처리가 가능하다.
-
2. 루씬이 제공하는 두 가지 핵심 기능
1) 색인
- 검색 엔진의 구조에 맞게 데이터를 저장하는 행위로, 그 결과물인 데이터도 색인이라고 한다.
- 색인 (명사) : 검색 엔진의 데이터 구조에 맞게 빠른 검색이 가능하도록 변환된 객체
- 색인하다 (동사) : 색인을 저자하는 행위. 인덱싱 이라고도 부른다!
- 역색인 : 텀 (Term)이 키 (Key)가 되는 색인 구조
- 페이지 중심의 데이터를 키워드 중심의 데이터 구조로 역으로 바꾸는 것!
- 내부적으로 해시 테이블 (Hash Table)이나 이진 트리 (Binary Tree) 자료 구조를 사용함
- 텀 뿐 아니라 도큐먼트의 단어 위치와 같은 메타 데이터 또한 가지고 있음!
- 루씬 색인의 특징
- 우수한 확장성과 고성능의 색인
- 현대적 하드웨어에서 시간당 150GB 이상 처리 가능
- 작은 메모리 사용량 (1MB 힙 메모리 요구)
- 색인이 늘어나도 배치 색인만큼 빠른 색인 가능
- 텍스트 색인 시 색인 파일의 용량은 텍스트의 20~30% 수준!
2) 검색
- 검색 엔진에서의 검색은 사용자 질의에 적합한 도큐먼트를 색인에서 찾는 일 이라 할 수 있음!
- 검색 프로세스
- 질의어를 분석기를 사용해 먼저 분석
- 찾고자 하는 텀이 포함된 모든 도큐먼트를 역색인 구조 에서 찾는다.
- 루씬 검색의 특징
- 가장 적합한 결과를 상위에 반환하는 순위 검색 지원
- 풍부하고 강력한 검색어 유형 제공 : Phrase Query, Wildcard Query, Proximity Query, Range Query
- 필드 검색 지원
- 어떠한 유형의 필드로도 정렬 가능
- 다중 색인 검색 지원
- 준 실시간 검색 가능 : 동시 업데이트 및 검색 가능
- 유연한 그룹핑, 강조 표시, 조인 및 결과 그룹화 지원
- 검색 속도가 빠르고 메모리 효율이 좋을 뿐 아니라 오타를 보정하는 자동완성 기능 제공
- 검색 스코어링 모델 지원 : 벡터 공간 모델 및 BM25를 포함한 플러그인 형태로 제공
3. 핵심 클래스 리뷰
1) 색인 관련 클래스
- 분석기는 원본 도큐먼트에서 추출한 텍스트를 공백 단위로 자르고, 불필요한 조사는 버린 뒤 역색인 구조에 저장함
- 도큐먼트를 생성하고 나면 색인을 물리적 위치에 저장함
- 종류
IndexWriter
: 루씬의 색인을 담당하는 클래스. 디렉토리에서 사용하는 파일을 만든다.Directory
: 루씬의 색인 저장 공간. 단순한 파일 리스트로 메모리 (RAM), DB, 파일 중 하나 를 저장소로 사용Analyzer
: 텍스트 분석기! 텍스트를 색인할 단위로 텀을 분리하고, 불용어 제거Document
: 색인하고 검색하는 단위로, 필드의 집합Field
: 도큐먼트의 일부분. 각각의 필드는 이름, 타입, 값을 가진다.Term
: 분석기에 의해 만들어진 텍스트로 표현된 단어. 검색의 기본 단위
2) 검색 관련 클래스
- 사용자가 무엇을 검색하고 싶은지 쿼리로 질의하면,
- 루씬은 색인 디렉토리 안에 있는 도큐먼트와 필드 내용을 검색한 후 결과값을 반환함!
- 종류
IndexSearcher
: 검색 과정에서 색인을 읽고 검색Analyzer
: 질의어를 텀으로 변환해 역색인 구조를 조회하게 용이하게 만든다Query
: 질의를 위한 클래스. 추상 클래스로 다양한 질의 방법 제공
3) 루씬의 색인과 검색 과정
- 필드를 가진 도큐먼트 생성
IndexWriter
객체를 만들고 도큐먼트를addDocument()
메소드를 사용해 색인에 추가QueryParser.parse()
사용해 문자열에서 쿼리 생성IndexSearcher
를 생성하고 쿼리를search()
메소드에 전달!