Apache Lucene 1 (Search Engine)

Apache Lucene 1


0. 실습 Git 주소

Search API

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 : 검색을 위한 패키지
  • analyzers-common : 다국어 지원 분석기
  • analyzers-icu : 국제 유니코드 컴포넌트 통합 지원 분석기
  • analyzers-kuromoji : 일본어 분석기
  • analyzers-smartcn : 중국어 분석기
  • classification : 분류 모델
  • queries : 루씬 코어 라이브러리에 추가된 필터와 쿼리

핵심 클래스

  • 색인 관련 클래스
    • IndexWriter : 디렉터리에서 사용하는 파일을 만든다.
      • addDocument(도큐먼트 생성, 추가), deleteDocument(도큐먼트 삭제), updateDocument(도큐먼트 수정) 메소드 제공
    • Diretory : 루씬의 색인 저장 공간이다. 단순한 파일 리스트인데 메모리, DB, 파일 중 하나를 저장소로 사용한다.
    • Analyzer : 텍스트분석기로 텍스트를 색인할 단위로 텀을 분리하고, 불용어 제거 등의 일을 한다.
    • Document : 색인하고 검색하는 단위로 필드의 집합
    • Field : 도큐먼트의 일부분으로 각각의 필드는 이름(Name), 타입(Type), 값(Value)를 가지고 있다. 값으로는 텍스트 또는 바이너리, 숫자가 올 수 있다.
    • Term : 분석기에 의해 만들어진 텍스트로 표현된 단어. 검색의 기본단위이기도 하다.
  • 검색 관련 클래스
    • IndexSearcher : 검색 과정에서 색인을 읽고 검색한다.
    • Analyzer : 텍스트를 분석하낟. 질의어를 텀으로 변환해 역색인 구조를 조회하기 용이하게 한다.
    • Query : 질의를 위한 클래스, 추상클래스이며, 다양한 질의 방법을 제공.
  • 루씬의 색인 및 검색 과정 예시
    • 필드를 가진 도큐먼트 생성
    • IndexWriter객체를 만들고 도큐먼트를 addDocument()메소드를 사용해 색인에 추가
    • QueryParser.parse()를 사용해 문자열에서 쿼리를 만든다.
    • IndexSearcher를 생성하고 쿼리를 search()메소드에 전달한다.