Backend/Elastic Search

[Elastic Search] 루씬 살펴보기

동구름이 2024. 7. 8. 20:30

엘라스틱 서치의 기본 개념과 특징을 살펴보려한다. 그전에 루씬에 대해 간략히 살펴보자.

 

 

루씬

검색 엔진에는 루씬이라는 시초가 있었다. 루씬이란, 자바로 만들어진 고성능 정보 검색 라이브러리이다. 

 

 엘라스틱 서치에서 왜 루씬을 언급하느냐하면, 엘라스틱 서치가 루씬을 기반으로 하기 때문이다. 엘라스틱 서치는 내부적으로 루씬을 통해 검색 기능을 수행한다. 

 

 다만, 루씬의 동작 과정이 추상화되어 있어 엘라스틱 서치를 사용하는 사용자 입장에서는 잘 드러나지 않는다. 하지만 루씬의 동작 원리를 이해하면 엘라스틱 서치의 이해에 더 큰 도움이 될 수 있다.

 

 루씬에 대해서 간단히 살펴보겠다.

 

 

루씬 검색 어플리케이션 구조

https://jackjeong.tistory.com/entry/Lucene-In-Action-1-%EB%A3%A8%EC%94%ACLucene%EC%9D%98-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EA%B5%AC%EC%A1%B0

 

 위 그림처럼, 루씬의 검색 어플리케이션 구조는 검색 대상을 분석하는 과정검색 과정으로 나뉜다.

 

검색 대상 분석 과정

 검색 대상 텍스트 확보 -> 루씬 문서 생성 -> 문서 텍스트 분석 -> 색인에 문서 추가

 

검색 대상 텍스트 확보는 말 그대로 색인 작업을 진행할 대상을 확보하는 것이다.

 

루씬 문서 생성은, 대상을 확보하고 문서(Document)로 변환하는 것이다. 여기서 문서란, 루씬에서 사용하는 개별 단위를 말한다. 루씬 문서는 여러 개의 필드로 구성된다.

 

텍스트 분석은 문서 내의 텍스트를 토큰이라고 불리는 단위로 분리하는 것이다. 루씬 내에 텍스트 분석기가 내장되어있다.

 

그리고 색인 과정이 끝난 문서를 해당 색인에 추가하게 된다.

 

 

검색 과정

검색 화면 인터페이스 -> 검색 질의 생성 -> 질의 실행 -> 결과 출력

 

 우선, 검색 화면 인터페이스를 통해 검색어를 전달 받으면, 전달받은 검색어를 검색 엔진에서 인식하는 Query 객체로 변환한다. (검색 질의 생성)

 

 그리고 실제 색인을 찾으며, 검색 질의에서 생성한 query 객체에 해당하는 결과를 받아온다. 이 때, 루씬에서는 2종류의 검색 모델을 사용한다.

 

1. 순수 불리언 모델

 지정된 질의에 문서가 해당하는지, 아닌지를 판단한다.

 

2. 벡터 공간 모델

 질의와 문서 모두 고차원 공간의 벡터로 표현한다. 벡터 간 거리 계산을 통해, 문서와 질의 사이의 연관도와 유사도를 산출할 수 있다.

즉 세부적인 점수 산출이 가능하다.

 

루씬에서는 위의 2가지 모델을 사용하며 어떤 모델을 사용할지 지정하는 것이 가능하다.

 

 

 

검색 어플리케이션의 나머지 요소인 관리 인터페이스와 분석 인터페이스도 간략히 살펴보자.

 

 관리 인터페이스는 말 그대로 검색 과정에서의 설정 기능을 담당하는 곳이다. 서버 시작과, 종료, 레플리카 상태 관리, 메모리 버퍼 용량 등의 상태를 API로 설정할 수 있다.

 

 분석 인터페이스는 루씬에서의 검색 결과를 분석하는 곳이다. 실행된 질의의 빈도 수, 검색에 걸리는 시간 등 색인 과정과 관련된 여러 수치를 분석한다. 보통 별도 서버에 구성한다.

 

 

 

 

 이렇게 검색 대상을 분석하는 과정과 검색 과정으로 나뉘는 루씬의 검색 어플리케이션 구조를 알아보았다. 그럼 각각의 과정에서 어떤 클래스들이 필요한지 살펴보자.

 

색인 관련 핵심 클래스

 

루씬에서 색인 시에 필요한 클래스는 위와 같다. 왼쪽부터 차례로 살펴보자.

 

1. Field

 실제 색인할 대상 텍스트를 담는 클래스이다. 색인의 각 문서는 모두 2개 이상의 이름이 지정된 개별 필드로 구성되는데, 각 필드는 Field 라는 클래스로 표현된다.

 

2. Document

Document 클래스는 개별 필드의 집합이다. 검색 결과 단위로서 하나 이상의 Field 객체를 담고 있는 것이다.

 

 Document 클래스는 같은 이름의 필드가 2개 이상 들어갈 수 있는데, 이런 경우에는 Document 객체에 추가된 순서대로 값을 연결해 색인한다. 즉 두 필드의 값을 연결해 하나의 필드를 지정한 것처럼 동작하는 것이다.

 

3. Analyzer

Analyzer 클래스는 텍스트를 색인할 단어로 분리하고 필요 없는 단어를 제거하는 역할을 담당한다.

 

텍스트를 색인하기 전 Analyzer를 거쳐 단어로 분리하는 것이다.

 

4. IndexWriter

 IndexWriter는 이름 처럼 색인을 작성하는 중심 클래스이다. 색인을 새로 생성하거나, 색인 내부의 문서를 추가, 삭제, 변경하는 기능을 담당한다. 검색하는 기능은 지원되지 않는다.

 

5. Directory

루씬의 색인을 저장하는 공간이다.

 

 

검색 관련 핵심 클래스

IndexSearcher, Term, Query, TermQuery, TopDocs

 

1. IndexSearcher

IndexWriter가 인덱스를 생성하는 것이었다면, IndexSearcher는 인덱스 검색을 담당한다. 색인을 읽기 전용으로 열어 사용한다.

 

 여러 종류의 검색 메서드를 지원하는데, 가장 간단한 메서드는 Query 객체와 결과로 받을 문서 개수를 인자로 정해 TopDocs 객체를 통해 결과를 넘겨 받는다.

Directory dir = FSDirectory.open(new File("/tmp/.."));
IndexSearcher searcher = new IndexSearcher(dir);

Query q = new TermQuery(new Term("name", "target"));
TopDocs hits = searcher.search(q,10);
searcher.close();

 

 

 

 

아래 코드를 통해 나머지 클래스를 살펴보자

Query q = new TermQuery(new Term("name", "target"));

2. Term

Term는 검색 과정을 구성하는 기본적인 클래스이다. 필드 이름과 해당 필드에 속한 단어의 쌍으로 이루어진다.

 

3. Query

Query 클래스는 최상위 질의 클래스이다. 그리고 Query 클래스를 상속받아 다양한 질의 클래스를 구현할 수 있다.

 

4. TermQuery

가장 기본적인 기능을 가진 쿼리이다. 특정 필드에 원하는 단어가 들어있는 문서를 찾아낸다.

 

 

5. TopDocs

최상위 N개의 문서에 대한 링크를 담고 있는 결과를 반환하는 클래스이다. 결과마다 각 문서의 정수형 DocsID와 float 자료형 점수를 담고 있다.

 

 

 

 

 

 

여기까지 간략하게 루씬에 대해 살펴보았다. 다음 포스팅에서 엘라스틱 서치의 기본 개념과 특징을 살펴보겠다.

 

참고자료

https://jackjeong.tistory.com/entry/Lucene-In-Action-1-%EB%A3%A8%EC%94%ACLucene%EC%9D%98-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EA%B5%AC%EC%A1%B0