속도 < 방향

[검색엔진] 검색 시스템 이해하기 1 - 엘라스틱서치 중심으로 본문

개발

[검색엔진] 검색 시스템 이해하기 1 - 엘라스틱서치 중심으로

import max 2024. 10. 18. 13:46

작성일 : 2024-10-18

레퍼런스 : 엘라스틱서치 실무 가이드


1.1 검색 시스템의 이해

1.1.1 검색 시스템이란?

네이버, 구글 등에서 제공하는 다양한 서비스 중 가장 큰 비중을 차지하는 것은 사용자가 원하는 검색어에 대한 결과를 검색 서비스일 것이다. 이를 부르는 용어도 다양한데 검색엔진, 검색 시스템, 검색 서비스 등 다양한 용어가 혼용되어 불리고 있다. 

 

우선 검색엔진은 광활한 웹에서 정보를 수집하여 검색 결과를 제공하는 프로그램인데, 제공되는 데이터 특성에 따라 구현 형태가 각각 달라진다. 야후(Yahoo)는 디렉터리 기반의 검색 결과를 세계 최초로 제공했다. 요즘에는 대범주(뉴스, 블로그, 카페)에 따른 카테고리별 검색 결과를 대부분의 검색 엔진에서 제공한다.

 

검색 시스템은 대용량 데이터를 기반으로 신뢰성 있는 결과를 제공하기 위해 검색엔진을 기반으로 구축된 시스템을 통칭한다. 수집기를 이용해 방대한 데이터를 수집하고 이를 검색엔진으로 색인하여 결과를 UI로 제공한다. 내부 정책에 따라 관련도가 높은 순서대로 결과의 상위에 배치하거나, 특정 필드나 문서에 가중취를 둬서 검색의 정확도를 높일 수 있다.

 

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

 

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


엘라스틱서치는 검색엔진 이라고 볼 수 있으며, 검색 서비스를 제공하기 위해 엘라스틱서치를 활용하여 검색 시스템을 구축할 수 있다.

 

1.1.2 검색 시스템의 구성요소

개발사별로 구조는 조금씩 다르지만 기본적인 구조는 같다. 일반적으로 수집기 (정보수집), 스토리지 (데이터 저장), 색인기 (데이터를 검색에 용이하도록 변환), 검색기 (색인된 데이터에서 검색) 로 구성된다.

 

수집기

수집기는 웹에서 필요한 정보를 수집하는 프로그램이다. 크롤러, 스파이더, 스크래퍼, 웜, 웹 로봇 등으로 불린다. 파일, DB, 웹페이지 등 웹에서 마주치는 대부분의 정보를 대상으로 수집한다. 파일을 수집할 경우 파일명, 파일경로, 파일내용 등의 정보를 수집 및 저장하면 검색엔진이 저장된 정보를 검색하여 사용자 질의에 답한다.

 

스토리지

데이터베이스에서 데이터를 저장하는 물리적인 저장소이다. 검색엔진은 색인한 데이터를 스토리지에 보관한다.

 

색인기

검색엔진이 수집한 정보에서 사용자 질의와 일치하는 정보를 찾으려면 수집 데이터를 검색이 가능한 구조로 가공하고 저장해야 하는데, 그 역할을 하는 것이 색인기다. 보통 다양한 형태소 분석기를 조합해 정보에서 의미있는 용어를 추출하고 검색에 유리한 역색인 구조로 데이터를 저장한다.

 

검색기

사용자 질의를 입력받아 역색인 구조에서 일치하는 문서를 찾아 결과로 반환한다. 질의-문서 사이의 일치 여부는 유사도 기반 알고리즘으로 판단한다. 검색기 또한 형태소 분석기를 통해 사용자 질의 내에서의 유의미한 용어를 추출하여 검색한다. 검색 품질은 사용하는 형태소 분석기에 따라 달라진다.

 

 

1.1.3 관계형 데이터베이스(RDBMS)와의 차이점

관계형 데이터베이스와 검색엔진 모두  질의와 일치하는 데이터를 찾아 사용자에게 데이터를 제공한다. 하지만 관계형 데이터베이스로 검색 기능을 제공하는 데는 한계가 있다. 

 

데이터베이스는 데이터를 통합 관리하는 데이터의 집합으로, 저장 방식에 따라 관계형-계층형으로 나뉜다. 모든 데이터는 중복을 제거하고 정형 데이터로 구조화해 행과 열로 구성된 테이블에 저장된다. SQL문을 이용해 원하는 정보의 검색이 가능한데, 텍스트 매칭을 통한 단순한 검색만 가능하며 변형하거나 동의어, 유의어를 활용한 검색은 불가하다.

 

반면, 검색엔진은 데이터베이스에서 불가능한 비정형 데이터를 색인, 검색하는 것이 가능하고 형태소 분석을 통해 사람이 구사하는 자연어 처리가 가능하며 역색인 구조를 기반으로 빠른 검색 속도를 보장한다.

엘라스틱서치 관계형 데이터베이스
인덱스 데이터베이스
샤드 파티션
타입 테이블
문서
필드
매핑 스키마
Query DSL SQL

 

 

엘라스틱서치는 하나의 인덱스에 하나의 타입을 구성하고 있다. 하나의 행을 문서라고 부르며, 해당 문서는 데이터베이스 테이블의 한 행을 의미한다. 엘라스틱서치의 매핑은 필드의 구조와 제약조건에 대한 명세를 말하며, 데이터베이스의 스키마와 같은 역할이다.

 

둘은 인덱스라는 개념을 다르게 사용하는데, 관계형 데이터베이스의 인덱스는 WHERE 절의 쿼리와 JOIN을 빠르게 만드는 보조 데이터 도구로 사용된다. 

 

데이터 추가, 수정, 삭제 방식에도 차이가 있는데 엘라스틱서치는 기본적으로 HTTP를 통해 JSON 형식의 RESTful API를 이용한다. 기본적으로 자바로 개발되었지만, 여러 프로그래밍 언어를 활용할 수 있다.

 

엘라스틱서치의 HTTP 메서드 기능 데이터베이스 질의
GET 데이터 조회 SELECT
PUT 데이터 생성 INSERT
POST 인덱스 업데이트, 데이터 조회 UPDATE, SELECT
DELETE 데이터 삭제 DELETE
HEAD 인덱스 정보 확인 -

 

 

RESTful API는 HTTP 헤더와 URL만 사용해 다양한 형태의 요청을 할 수 있는 HTTP 프로토콜을 최대한 활용하도록 고안된 아키텍처다. 아래와 같이 간단한 API 요청을 할 수 있다.

curl -X(메서드) http://host:port/(인덱스)/(타입)/(문서 id) -d '{json 데이터}'

 

curl : 리눅스 기본 명령어로, 커맨드 라인에서 간단하게 HTTP 요청을 보낼 수 있다.
-X 옵션을 사용하여 GETP, POST, PUT, DELETE, HEAD 같은 HTTP 메서드를 설정할 수 있다.

GET : 문서의 현재 상태

POST : 특정 상태 생성 및 문서 조회

PUT : 문서 업데이트

DELETE : 문서 삭제

HEAD : 특정 문서 정보 유무 확인

 

이를 적용하면 다음과 같이 확인할 수 있다.

curl -XGET https://localhost:9200

 

 

이제, 엘라스틱서치와 데이터베이스를 비교해보자.

ID Name Location Gender Date
1 김태리 서울 2024-10-18
2 알렉스 베를린 2024-10-19

 

위와 같은 표가 있을 때, 데이터베이스에서 '김태리' 라는 사용자의 데이터를 조회하려면 Like 문법을 이용한 SQL문을 작성해야 한다.

SELECT * FROM USER WHERE Name like '%김태리%'

 

쿼리문을 실행한 결과는 아래와 같다.

ID Name Location Gender Date
1 김태리 서울 2024-10-18

 

 

 

 

엘라스틱서치에서 같은 내용을 검색하려면 Search API를 사용해야 한다.

GET http://localhost:9200/user/_search?q=Name:김태리

 

검색 결과는 JSON문서 형태로 출력된다.

{
    "ID" : 1,
    "Name" : "김태리",
    "Location" : "서울",
    "Gender" : "여",
    "Date" : "2024-10-18"
}

 

두 가지 방식 모두 '김태리'라는 사용자의 정보를 잘 찾아내는데, 데이터베이스는 SQL문으로 작성하여 하나의 행을 얻었고 엘라스틱서치는 json 형태의 문서로 결과가 출력되는 것을 볼 수 있다.

 

만약 이름이 영문으로 되어있었다면 서로 다른 결과가 나올 수도 있다. '김태리'라는 이름이 'Kimtaeri'로 되어있다고 가정 시, SQL문은 WHERE 절에 Name like '%Kimtaeri%'라고 대소문자 구분을 명확하게 한 후 입력해야 검색이 가능하다. 만약 모든 문자열이 소문자이거나 대문자일 경우 해당 데이터를 찾을 수 없다.

 

반면, 엘라스틱서치는 좀 더 유연하기 때문에 역색인되는 문자열 전체를 정책에 따라 소문자 혹은 대문자로 생성하고 쿼리가 들어오는 필터를 색인 시간과 검색 시간에 동일하게 지정한다면 해당하는 쿼리에 어떠한 문자열 (KIMTAERI, kimtaeri, Kimtaeri) 이 들어와도 검색이 가능하다.

또한, 구조화되지 않은 비정형 데이터도 검색이 가능하다는 장점이 있는데 데이터베이스는 스키마를 미리 정의해야만 데이터 저장, 조회가 가능한 반면 엘라스틱서치는 구조화되지 않은 데이터까지 스스로 분석해 자동으로 필드를 생성하고 저장한다.