* 본 글을 검색엔진이 생소한 사람들의 이해를 돕고자 하는 글로, 세부적인 내용 보다는 전반적인 개념에 대한 설명에 초점을 맞추고 있습니다.
온라인 마켓의 규모가 커지고 상품의 수가 증가 함에 따라 검색은 특정 지식에 대한 검색뿐만 아니라, 상품의 검색에 있어서도 중요한 부분으로 자리 잡게 되었습니다. 이에 티몬 서비스에서도 엘라스틱서치(Elasticsearch)라는 오픈소스 검색 솔루션을 도입하여 상품 검색 기능을 제공하고, 고객들에게 원하는 상품을 조금 더 편리하고 손쉽게 찾을 수 있도록 편의를 돕고 있습니다.
티몬 서비스에서 사용하는 엘라스틱서치는 루씬(Lucene)을 기반으로 한 검색엔진 입니다.
|
|
|
|
루씬도 엘라스틱서치도 모두 검색엔진 입니다. 그럼 루씬과 엘라스틱서치는 무엇이 다른 걸까요? |
|
|
|
|
루씬(Lucene)
● 특징
- 고성능 정보 검색(IR*, Information retrieval) 라이브러리
- 애플리케이션에 정보 검색 기능 추가 가능
- 안정적이며 무료로 사용할 수 있는 오픈 소스 프로젝트 - http://lucene.apache.org/
- 자바로 구현
- 소프트웨어 재단에서 아파치 소프트웨어 라이센스로 배포
● 장점
- API를 통해 최소한의 노력으로 전문(full-text)색인과 검색 기능 사용 가능
- 간결하면서도 매우 강력
|
|
|
|
IR (Information Retrieval) 문서를 검색하거나, 문서의 내용을 검색하거나, 문서와 연관된 메타 정보를 검색해 가는 과정 |
|
|
|
|
엘라스틱서치(Elasticsearch)
● 특징
- 루씬(Lucene )이 제공하는 대부분의 기능 지원
● 장점
- 색인이 완료됨과 동시에 검색을 할 수 있는 실시간 검색 지원
- 여러 개의 노드로 구성이 가능하며, 각 노드에 분산 저장하여 복사본 유지
- 색인 시, 모든 문서 JSON 기반으로 저장
- RESTFul API를 지원하며, URI로 동작 가능
- 다양한 plug-in 이 많음
위 특징을 살펴보면, 기본적으로 엘라스틱서치는 루씬을 기반으로 하고 있습니다.
그렇다면 왜 루씬을 쓰지 않고 엘라스틱서치를 사용할까요?
루씬은 검색과 색인에 필요한 강력한 API를 제공하고 있지만, 이것이 솔루션 형태가 아닌 라이브러리로 제공되고 있어서 많은 부분을 직접 개발해야 하는 불편함이 있습니다.
하지만,
엘라스틱서치는 설치 및 구성이 간편할 뿐 아니라 기본적으로 루씬이 가진 기능을 제공 하면서도 분산처리를 비롯한 대용량 데이터를 처리하기 위한 다양한 기능을 가지고 있습니다.
이 밖에도 루씬은 엘라스틱서치 뿐 아니라 쏠라(Solr), 티카(Tika) 등의 기반이 되기도 합니다.
그러니, 루씬을 이해한다면 다른 검색엔진의 이해에도 큰 도움이 될 것이라 생각됩니다.
<엘라스틱서치, 솔라, 티카의 기반이 되는 루씬>
● Elasticsearch
- 신생 검색엔진으로, Solr의 단점을 상당 수 보완
- 중소 규모의 검색 서비스에 적합
● Solr
- elasticsearch에 비해 어 정도 안정화 되어 있는 검색엔진, vendor support 가능
- 대용량 검색 서비스에 적합
● Tika
- 다양한 문서에서 텍스트를 추출 할 수 있는 라이브러리
|
|
|
|
루씬은 애플리케이션이 아닙니다. 루씬은 라이브러리입니다. |
|
|
|
|
루씬을 처음 사용한다면 루씬이 파일 검색이나 웹 문서 수집, 웹 검색 등에 바로 사용할 수 있는 애플리케이션이라고 오해하는 경우가 많습니다. 루씬은 이런 종류의 애플리케이션이 아니라 소프트웨어 라이브러리이며, 검색 기능을 갖고 있는 애플리케이션을 개발할 때 사용할 수 있는 도구 일 뿐입니다.
그렇다면 루씬을 이해하는데 있어서 가장 중요한 요소는 무엇일까요?
기본적으로 검색 애플리케이션은 기본적으로 아래와 같은 구조를 가집니다.
검색 애플리케이션은 크게 데이터를 수집하여 ‘색인’ 하는 과정과 사용자로부터 검색어를 입력 받고 해당 내용을 ‘검색’ 하는 과정으로 이루어 집니다.
<검색 애플리케이션의 기본 구조>
이 중에서 루씬은 그림에 표시된 것과 같이 전체 요소 중 핵심이 되는 색인과 검색의 기능을 담당하고 있습니다. 검색대상을 수집하거나, 사용자로부터 검색어를 입력 받는 등의 행위는 루씬에는 포함되어 있지 않습니다.
|
|
|
|
그럼, 색인과 검색에 대해서 알아보도록 하겠습니다. |
|
|
|
|
색인 과정의 구성 요소
|
|
|
|
색인(index) 대량 문서에서 원하는 내용을 빠르게 검색하고자 할 때 원본 문서를 색인하고 검색하기 좋은 형태로 변환해 색인으로 만들어두는 처리 과정(indexing), 이 과정을 거친 결과물(index) |
|
|
|
|
루씬의 색인 절차는 크게 원본 문서에서 1. 텍스트를 추출하고(Parser), 2. 텍스트를 분석하고(Analysis), 3. 색인(Index)에 추가하는 세 단계로 구분할 수 있습니다.
<루씬의 색인 절차>
● Parser (파서)
텍스트를 추출하고 루씬 Document를 생성하는 과정으로, Document에 포함된 Field 객체의 텍스트 중 색인 하고자 하는 항목은 모두 분석과정을 거치게 됩니다.
● Analysis (분석기)
필드에 지정된 텍스트를 색인 내부에서 사용하는 가장 기본적인 단위인 term으로 분리하는 작업으로,
- 텍스트에서 단어 분리
- 특수 문자 제거
- 액센트가 있다면 제거
- 모든 글자를 소문자로 변경 (정규화)
- 너무 흔해 의미가 없는 단어 (불용어) 제거
- 필요한 경우 단어의 기본형으로 찾아 변경
위의 일련의 과정을 거친 결과물을 token이라고 하며 이것이 분석의 기본 단위가 됩니다.
그리고 분석을 거친 후 term 의 형태로 색인에 추가됩니다.
|
|
|
|
<토큰 분리 예제>
입력문장 : “The quick brown fox jumped over the lazy dog”
· WithespaceAnalyzer [The] [quick] [brown] [fox] [jumped] [over] [the] [lazy] [dog]
· SimpleAnalyzer [the] [quick] [brown] [fox] [jumped] [over] [the] [lazy] [dog]
· StopAnalyzer [quick] [brown] [fox] [jumped] [over] [lazy] [dog]
· StandardAnalyzer [quick] [brown] [fox] [jumped] [over] [lazy] [dog]
* 아시아 언어(CJK : 한국어, 중국어, 일본어)에 대해 유의미한 분석 가능한 분석기 - StandardAnalyzer
* 루씬 contlib에서 지원하는 분석기를 이용하여 아시아 언어 분석 가능 - CJKAnalyzer (한글에서 가장 많이 사용하는 분석기) - ChineseAnalyzer - SmartChineseAnalyer |
|
|
|
|
검색 과정 구성 요소
|
|
|
|
검색(searching) 색인에 들어있는 토큰을 기준으로 해당하는 토큰이 포함된 문서를 찾아내서 사용자 관점의 우선순위를 부여하는(ranking) 과정을 말함 |
|
|
|
|
● 검색 사용자 인터페이스
웹브라우저나 휴대용 기기등에서 직접 보면서 검색 애플리케이션을 사용하는 화면으로 사용자가 검색을 용이하게 할 수 있도록 심플하고 검색을 하기 쉬운 형태로 만들어져야 합니다.
● 검색 질의 생성
전달 받은 검색어를 엔진에서 인식하는 Query객체로 변환하는 과정으로 루씬에서 제공하는 API를 이용해 용도에 따라 다양한 Query객체를 사용할 수 있습니다.
|
|
|
|
<루씬의 대표적인 검색 API>
· IndexSearcher 색인을 검색하는 기능을 담당하는 클래스, 모든 검색 기능은 IndexSearcher 인스턴스의 여러가지 search 메소드를 통해 진행
· Query 실제 Query 하위 클래스에서 특정 질의 기능을 구현, IndexSearcher의 search 메소드에 Query 객체를 직접 인자로 넘겨줄 수 있음
· QueryParser 사람이 직접 입력하고 사람이 한눈에 알아볼 수 있는 텍스트 형태의 질의를 분석해 루씬 Query 객체로 변환
· TopDocs IndexSearcher.search 메소드에서 검색한 결과 중 연관도 점수가 가장 높은 결과 문서를 담든 클래스
· ScoreDoc TopDocs 클래스에 담긴 검색 결과 하나를 나타내는 클래스 |
|
|
|
|
|
|
|
|
Score (연관도 점수)
루씬 검색의 가장 핵심적인 특징으로, 검색과정에서 질의에 해당하는 문서를 찾아낼 때마다 해당 문서가 질의에 얼마나 비슷하게 일지하는지 점수 부여하는 과정
루씬의 연관도 점수 계산 공식
· TF (Term Frequency) - 문서(d)의 텀(t)에 대한 term 빈도수 - 해당 문서에서 term이 몇번이나 나타나는지를 뜻함
· IDF (Inverse Document Frequency) - 해당 term에 역 빈도수 - 흔한 단어일 수록 idf값이 낮아지고 찾아보기 힘든 단어일수록 idf값이 높아짐
· COORD (Coordination factor) - 질의에 지정된 term 중 특정 문서에 포함된 term의 개수에 따라 정해지는 조율 - 질의에 해당하는 term을 더 많이 포함하고 있는 문서일수록 높음
· lengthNorm - 필드 안에 속한 term의 개수를 정규화한 값 - 필드 원문의 길이가 짧은 문서가 더 높은 유사도 점수를 받음
· queryNorm - 질의의 각 term에서 중요도의 제곱 합을 정규화한 값
· boost(index) - 색인 시 특정 문서에 가중치를 적용
· boost(query) - 검색 시 특정 검색어에 가중치 적용 |
|
|
|
|
● 질의로 검색
Searcher 객체를 이용하여 생성한 Query객체에 대한 검색을 실행합니다. 검색 결과에 해당하는 document 객체를 반환합니다.
|
|
|
|
루씬 API 사용 예제
TermQuery tq = new TermQuery(new Term(“fieldName”, “term”)); // 쿼리 객체 생성 TopDocs docs = IndexSearcher.search(tq, 10); // 검색 실행및 결과 반환 |
|
|
|
|
● 결과 출력
검색결과로 반환된 Document객체를 사용자가 직관적으로 알아보기 좋게 구성하여 화면에 출력합니다.
지금까지 검색 애플리케이션에서 검색엔진으로 사용되는 엘라스틱서치와 루씬의 개념, 그리고 검색의 기본 매커니즘과 이를 강력하게 지원하는 루씬에 대해 알아보았습니다. 전반적으로 검색 애플리케이션의 구성을 이해하고 색인과 검색이 검색 애플리케이션을 구성하는데 얼마나 중요한 요소인가를 알게 되는데 도움이 되었기를 바랍니다.
* 참고
● 루씬 인 액션 (고성능 오픈소스 자바 검색 엔진)
루씬 인 액션작가마이클 맥캔들리스, 에릭 해쳐|오티스 고...출판에이콘출판발매2013.08.30
● 시작하세요! 엘라스틱서치
시작하세요! 엘라스틱서치작가김종민출판위키북스발매2015.02.16
● 루씬 투토리얼
http://www.lucenetutorial.com/advanced-topics/scoring.html
Lucene Scoring - Lucene Tutorial.com
www.lucenetutorial.com
'기타 > 설치 및 설정' 카테고리의 다른 글
ERwin 7.3 평가판 무료 다운로드 및 설치하는 방법 (0) | 2021.04.14 |
---|---|
ERwin 설치법 (0) | 2020.02.18 |
ERwin 사용법 (0) | 2020.02.18 |
Elastic Search 개념 (0) | 2020.02.13 |
Elastic Search 란? (0) | 2020.02.13 |