ElasticSearch

검색시스템 이해하기

엔꾸꾸 2020. 6. 14. 03:57

서론

 

검색시스템과 검색엔진의 정의를 간략히 살펴보고, 엘라스틱서치와 데이터베이스의 차이점, 엘라스틱서치가 다른 검색엔진에 비해 가지는 강점 등을 살펴본다.

 

 

검색 시스템의 이해

 

최근에는 검색 서비스가 일상에서 빼놓을 수 없는 서비스로 자리매김 했다.

이런 검색 서비스들을 부르는 용어도 다양하다.

검색 엔진, 검색 시스템, 검색 서비스 등의 용어가 대표적이다.

 

 

검색 엔진

 

정의

 

검색 엔진은 컴퓨터 시스템에 저장된 정보를 찾아주는 것을 도와주도록 설계된 정보 검색 시스템이다.

검색 결과는 목록으로 표현되는 것이 일반적이다. 검색엔진을 사용하면 정보를 찾는데 필요한 시간을 최소화할 수 있다.

 

 

검색엔진을 간략하게 정리하면 다음과 같다.

 

  • 웹에서 정보를 수집해 검색 결과를 제공하는 프로그램이다.
  • 검색 결과로 제공되는 데이터의 특성에 따라 구현 형태가 각각 달라진다.
  • 야후는 디럭테리 기반의 검색 결과를 세계 최초로 제공했다.
  • 초기 검색엔진은 웹 디렉터리 기반으로 하고 있었지만, 지금은 웹 디렉터리를 검색엔진이라 하지 않는 편이다.
서버에서는 로봇 이라 불리는 특별한 프로그램을 이용해 웹 사이트들을 돌아다니며 웹 사이트들에 대한 정보를 미리 수집한다.

 

 

검색 시스템

 

검색 시스템은 대용량 데이터를 기반으로 신뢰성 있는 검색 결과를 제공하기 위해 검색엔진을 기반으로 구축된 시스템을 통칭하는 용어이다.

다수의 검색엔진을 이용해 색인하고 검색 결과를 UI로 제공한다.

 

 

검색 서비스

 

검색 서비스는 검색 엔진을 기반으로 구축한 검색 시스템을 활용해 검색 결과를 서비스로 제공한다.

 

 

이들의 포함관계는 다음과 같다.

검색 서비스 > 검색 시스템 > 검색 엔진

 

 

검색 시스템의 구성 요소

 

검색 시스템의 구조는 개발사 마다 서로 조금씩 다르지만 기본 구조는 동일하다.

  • 수집기
  • 스토리지
  • 색인기
  • 검색기

 

수집기

수집기는 웹에서 필요한 정보를 수집하는 프로그램이며, 크롤러, 스파이더, 웜, 웹 로봇 등으로 불린다.

 

 

스토리지

데이터를 저장하는 물리적인 저장소이다. 색인한 데이터를 스토리지에 보관한다.

 

 

색인기

수집된 데이터를 검색가능한 구조로 가공하고 저장하는 역할을 한다.

다양한 형태소 분석기를 조합하여 정보에서 의미가 있는 용어를 추출하고, 검색에 유리한 역색인 구조로 데이터를 저장한다.

 

 

색인

 

빠른 검색을 위해 문서에서 검색될 만한것 (Lexicon) 들의 존재여부와 위치 (Positing)을 미리 추출하여 빠른 탐색 자료구조를 구축해 두는것을 말한다.

 

 

역색인

 

어떤 키워드가 주어졌을때, 어느 문서에 속해있는지 목록을 유지하는 자료구조를 구축해 두는것을 말한다.

 

 

역색인의 구축 과정

  1. 원문에서 색인어를 추출한다.
  2. 원문에서 각 문서당 색인어 수를 샌다.
  3. 키워드 순서로 정렬한다.
  4. 키워드 마다 역색인 벡터를 만든다.
  5. 역색인 벡터를 압축한다.
  6. 키워드당 검색 순위를 미리 만든다.
  7. Lexicon을 Hashing, Btree, TRIE 자료구조로 색인한다.
  8. 키워드가 요청되면 열심히 찾는다.
실시간 검색의 속도 문제를 보완하기 위해 색인만으로는 한계가 있기 때문에 검색 속도의 향상을 위해 역색인 하는것이 필요하다.

 

검색기

 

검색기는 사용자 질의를 받아 색인기에서 저장한 역색인 구조에서 일치하는 문서를 찾아 결과를 반환한다.

검색기 또한 형태로 분석기를 사용해 사용자 질의에서 유의미한 용어를 추출해 검색한다.

따라서 사용하는 형태소 분석기에 따라 검색 품질이 달라진다.

 

관계형 데이터베이스와의 차이점

 

검색엔진의 비교대상은 항상 RDBMD (관계형 데이터베이스) 이다.

데이터베이스는 데이터를 구조화하고, 형과 열로 구성딘 테이블에 데이터를 저장하기 때문에 비즈니스에 적합하다. (Command)

반면 검색엔진은 데이터베이스에서 불가능한 비정형 데이터를 색인하고 검색에 최적화 되어있다. (Query)

 

 

엘라스틱서치와 관계형 데이터베이스의 비교

엘라스틱서치 관계형 데이터베이스
인덱스 데이터베이스
샤드 파티션
타입 테이블
문서 행(Row)
필드 열(Column)
매핑 스키마
Query DSL SQL
엘라스틱서치는 기본적으로 HTTP를 통해 JSON 형식의 RESTful API 를 제공한다.
이를 통해 검색, 삭제, 수정 등의 기능을 이용할 수 있다.

 

엘라스틱서치

 

대량의 데이터를 빠르게 검색하기 위해 NoSQL (No Structured Query) 를 많이 사용한다.

엘리스틱서치도 NoSQL의 일종이며, 분류가 가능하고 분산처리를 통해 실시간에 준하는 빠른 검색을 제공한다.

전문검색 (Full-Text Search)과 구조 검색 모두 지원한다.

 

 

엘라스틱서치의 특징

 

 

아파치 루씬 기반

 

아파치 루씬은 자바언어로 개발된 검색 라이브러리 이다.

현재는 엘라스틱서치를 비롯한 솔라, 티카 와 같은 프로젝트를 통해 널리 사용되고 있다.

아파치 루씬은 매우 강력한 기능이 있는 검색엔진이며, 사용자 위치 정보를 이용할 수 있고 다국어 검색, 철자 수정기능, 자동완성, 미리보기 등 다양한 기능을 지원한다.

 

 

실시간 분석

 

엘라스틱서치에 저장된 데이터는 검색에 사용되기 위해 별도의 재시작이나 상태 갱신이 필요하지 않다.

 

 

분산 시스템

 

엘라스틱서치는 여러 개의 노드로 구성되는 분산 시스템이다.

노드는 데이터를 색인하고 검색 기능을 수행하는 엘라스틱서치의 단위 프로세스이다.

소규모 시스템에서 적은 수의 노드로 시스템을 구성한 뒤 규모가 커지면 기존 노드에 새 노드를 실행해 연결하는 것으로 쉽게 확장이 가능하다.

또한 데이터는 각 노드에 분산되어 저장되며 복사본을 유지해 데이터의 유실을 방지한다.

 

 

높은 가용성

 

엘라스틱 서치는 하나 이상의 노드로 구성되어 있다.

각 노드는 1개 이상의 데이터 원본과 복사본을 가지고 있으며 서로 다른위치에 나누어 저장한다.

노드가 종료되거나 실행에 실패하는 경우 노드들의 상태를 감지하고 종료된 노드가 가지고 있던 데이터를 다른 노드로 옮기는 작업을 수행한다.

엘라스틱서치는 이런 과정으로 인해 항상 일정한 데이터 복사본의 개수를 유지하고 높은 가용성과 안전성을 보장한다.

 

 

멀티 테넌시

 

엘라스틱서치에서의 데이터는 여러 개로 분리된 인덱스들 (Indices)에 그룹으로 저장된다.

관계형 DB에서 다른 데이터베이스이 데이터를 검색하려면 별도의 커넥션을 생성해야 하지만, 엘라스틱서치에서는 서로 다른 인덱스의 데이터를 하나의 질의로 묶어 검색하고 여러 검새 결과를 하나의 출력으로 도출할 수 있다.

 

 

전문검색

 

엘라스틱서치는 데이터 색인을 통한 전문검색(Full-Text Search)를 지원한다.

 

 

JSON문서 기반

 

엘라스틱서치의 모든 데이터는 기본적으로 문서의 모든 필드가 색인되어 JSON구조로 저장된다.

따라서 모든 레벨의 필드에 접근이 쉬우며 매우 빠른 속도로 검색된다. NoSQL과 같이 스키마프리 (Schema Free)를 지원하므롤 별도의 사전 매핑없이 JSON 문서 형식으로 데이터를 입력하면 바로 검색가능한 형태로 색인 작업이 수행된다.

 

 

RESTful API

 

RESTfulAPI 를 지원하기 때문에 URI를 이용한 동작이 가능하다.

 

 

엘라스틱서치의 약점

 

  • 실시간이 아니다.
    • 일반적으로 색인된 데이터는 약 1초 뒤에나 검색이 가능해진다.
    • 이를 준 리얼타임이라고 한다.
  • 트랜잭션과 롤백 기능을 제공하지 않는다.
    • 전체적인 클러스터 성능 향상을 위해 롤백과 클러스터를 지원하지 않는다.
    • 최악의 경우 데이터 손실의 위험이 있다.
  • 데이터 업데이트를 제공하지 않는다.
    • 엘라스틱서치는 업데이트 명령 요청시, 기본 문서를 삭제하고 변경된 내용으로 재 생성한다.
    • 단순 업데이트에 비해 상대적으로 많은 비용이 발생하지만, Immutable 하다.

 

솔라, 몽고디비와 엘라스틱서치의 비교

 

솔라와 엘라스틱서치

  솔라 4.7.0 엘라스틱서치 1.0
문서 형식 XML, CSV, JSON JSON
REST API 지원 지원
라이브러리 PHP, 루비, 펄, 스칼라, 파이썬, .NET, 자바스크립트 PHP, 루비, 펄, 스칼라, 파이썬, .NET, 자바스크립트 ,Erlang, Clojure
Data Import 지원 JDBC, CSV, XML, Tika, URL, Flat File Rivers modules - ActiveMQ, Amazon SQS, CouchDB, Dropbox, DynamoDB, FileSystem, Git, Github, Hazelcast, JDBC, JMS, Kafka, LDAP, MongoDB, neo4j, OAI, RabbitMQ, Redis, RSS, Sofa, Solr, St9, Subversion, Twitter, Wikipedia
다중스키마 문서 지원하지 않음 지원
조인 지원하지 않음 parent_type/child_type을 이용해서 구현 가능
분산시스템의 노드 연결 주키퍼 젠 디스커버리, 주키퍼

 

몽고DB와 엘라스틱서치

  몽고DB 4.7.0 엘라스틱서치 1.0
구분 데이터 저장소 루씬기반 검색 엔진 애플리케이션
개발언어 C++ Java
운영체제 리눅스, 맥 OS X, 솔라리스, 윈도우 JVM이 존재하는 모든 OS
접속방식 자체 프로토콜 RESTful/HTTP API
문서구조 JSON JSON

 

보통 데이터 저장이 중요한 시스템에서는 몽고 DB, 검색이 중요한 시스템에서는 엘라스틱서치를 사용하도록 권장하고 있다