ES기초(0) NoSQL와 검색엔진(엘라스틱서치)
목차
- 들어가기전에
- Database의 역사
- SQL
- NoSQl
- SQL vs NoSQL
- 검색엔진 아키텍쳐
- Elasticsearch
0. 들어가기전에
우리가 프로그래밍을 처음 접할때, Spring 을 배울땐 MySql을 Node.js를 배울떄는 Mongo를 사용하였다. 데이터베이스는 특정 프레임워크에 맞추어 사용하는게 결정될까?
우리는 왜 크롤링 프로젝트에서 MongoDB를 선택했으며 광주소방청 프로젝트에선 Elasticsearch를 선택하였을까?
이 포스팅의 목적은 어떠한 데이터베이스가 더 뛰어나다라는것을 알리고 싶은것이 아닌, 이러한 각 저장소의 장단점을 알고, 상황에 맞는 선택을 돕고자 작성하였다.
1. Database의 역사
2. SQL이란?
대표DB:
Oracle, Mysql(Maria), MS-SQL, PostgressSQL
SQL을 사용하면 RDBMS에서 데이터를 저장, 수정, 삭제 및 검색 할 수 있음 관계형 데이터베이스에는 핵심적인 두 가지 특징이 있다.
- 데이터는 정해진 데이터 __스키마에 따라 2차원 테이블__에 저장된다.
- 데이터는 __관계__를 통해 여러 테이블에 분산된다. 이러한 관계를 통해 하나의 테이블에서 중복없이 하나의 데이터만을 관리 하기 때문에, 다른 테이블에서 부정확한 데이터를 다룰 위험이 없어진다.
관계란 두 entity사이의 논리적 관계를 말함
데이터는 테이블 레코드로 저장이된다. 테이블마다 명확하게 정의된 구조가 있으며 해당 구조는 필드의 이름과 데이터의 유형으로 정의가 된다.
스키마를 준수하지 않는 레코드는 테이블에 추가할 수 없다. 즉, 스키마를 수정하지 않는 이상 정해진 구조에 맞는 레코드만 추가가 가능하다.
3. NoSQL이란?
스키마 x, 관계x 가 없는 데이터 베이스, 말그대로 RDB의 반대로 보면 된다. SQL은 정해진 스키마를 따르지 않으면 데이터 추가가 불가능 하지만, NoSQL에서는 다른 구조의 데이터를 같은 컬렉션에 추가가 가능하다. 즉 바로 위에 관계형 데이트 베이스에서 보았던 Orders, Users, Product 테이블로 나뉜 것을 NoSQL에서는 Orders에 한꺼번에 포함하여 저장하게 된다. 이러한 이유에서 NoSQL에는 조인이라는 개념이 존재하지 않는다.
3-1 NoSQL의 종류
NoSQL은 아래와 같이 다양한 형태의 저장 기술로 나뉘고 있다.
-
KEY-VALUE STORE
- 대표DB: Redis, Memcached, EhCache, Hazelcast
- 특징
Key값은 어떠한 형태의 데이터라도 담을수 있음. 이미지, 비디오도 가능하다. 또한 __저장과 조회__라는 원칙에 출실한 간단한 API를 제공하는 만큼 질의의 속도가 굉장히 빠르다.
- 사용처
- 성능 향상을 위해 관계형 데이터베이스에서 데이터 캐싱할때
- 장바구니 같은 웹 어플리케이션에서 일시적인 속성을 추적할때
- 모바일 어플리케이션용 사용자 데이터 정보와 구성 정보를 저장할때
- 이미지나 오디오 파일같은 대용량 객체 저장
-
DOCUMNET STORE
- 대표DB : MongoDB, Amazone DynamoDB, CouchBase
- 특징
```
- Key-Value 모델과 다른 점이라면 Value가 __계층 형태인 도큐먼트(XML, JSON, BSON)__로 저장
- 집합적 데이터 모델: 관계형 데이터 베이스에서 여러개 테이블 데이터를 하나의 Documnet에 모아둘 수 있음
- 조회시 한번의 조회로 필요한 데이터 획득 (조인을 대체) ```
- 사용처
- 대용량 데이터를 읽고 쓰는 웹 사이트용 백엔드 지원할때
- 로깅 시스템
- 로그의 중앙집중화된 저장소로 사용하기에 적합
- 인터넷 상거래 시스템
- 비즈니스 요구사항의 변경에 능동적 대처가능
- 잦은 스키마의 변경이 있어도 데이터 변경에 대한 비용이 적음 (Schemaless)
- sns 서비스
- 블로그나 SNS 서비스 데이터에 적합
- Schema가 없기 때문에 다양한 컨텐츠를 취합하여 저장 관리 가능 (크롤링)
-
GRAPH DBMS
- 대표DB : Neo4J, RedisGraph, OrientDB
- 특징
개체와 관계를 그래프 형태로 표현, 관계형 모델이라고 할수 있고, 데이터 간의 관계가 탐색의 키일경우 적합 데이터를 노드로 표현하고 노드 사이의 __관계__를 엣지로 표현 서로 다른 데이터 소스의 정보를 연결하고 액세스하여 아직 생각하지 못했떤 질문에 답할수 있다.
- 사용처
- 지식 그래프/ 소셜그래프
- 제품 카달로그에 주제별 정보 추가
- 복잡한 법규모델 빌드 또는 쿼리
- Wikidata 같은 일반 정보 모델링
- 자격 증명 그래프
- 추천엔진
- 관심사, 친구, 구매이력과 같은 정보간의 관계를 저장하고 신속하게 쿼리하여 개인화 되고 관련성 높은 추천 제공
- 사기탐지
- 생명과학 분야등
- 지식 그래프/ 소셜그래프
-
WIDE COLUMN STORE
- 대표DB : Cassandra, HBase, Google BigTable
- 특징
```
- 위 모델이 Key-Value값을 이용해 필드를 정했으나, 특이하게 이 모델은 키에서 필드를 결정한다.
- SQL로 설명하자면 어트리뷰트가 계층적인 구조를 가지고 있는 격
- 대량의 데이터 압축, 분산처리, 집계처리 (sum, count, avg등) 쿼리 동작 속도 그리고 확장성이 뛰어나다 ```
-
SEARCHENGINE
- 오늘의 주제
- 대표DB : Lucene, Elasticsearch, Solr, sphinxsearch
-
특징
대량의 데이터와 텍스트 컨텐츠를 빠르게 검색하기 위한 저장 스토어입니다. 텍스트를 토크나이징 하여 색인을 하며 일반적으로 텍스트 검색 뿐만아니라 Ranking, Grouping, Aggregation, Geolocation 거리 계산등의 기능들도 같이 제공되고 있다.
4. SQL vs NoSQL
-
cap이론
- 현존하는 데이터 저장매체들은 위 세가지중(Consistency, Availability, Partition tolerance) 두가지만을 추구할수 있다
- 일관성(Consistency): 분산 시스템에서의 요청 및 응답 과정이 마치 한 노드에서 실행되는 것처럼 동작해야 한다.
- 가용성(Availability): 분산 시스템이 지속해서 가용하기 위해서 장애 없는(non-failing) 노드에 수신된 모든 요청은 반드시 응답돼야 한다.
- 분할 허용(Partition tolerance): 네트워크 분할 상황에서 서로 다른 구역에 있는 노드 간의 통신은 손실된다. 분할 허용하에서는 통신 문제로부터 메시지를 주고받지 못하더라도 서비스가 동작한다.
- 현존하는 데이터 저장매체들은 위 세가지중(Consistency, Availability, Partition tolerance) 두가지만을 추구할수 있다
SQL은 Consistency를 추구하는 데이터베이스이고 NoSQL 은 각각의 저장 특성에 맞춰 2가지를 선택하게 된다.
오늘 다루는 __검색엔진은 가용성과 분할 허용을 축으로 하는 서비스__이다. 일관성을 버림 즉 검색엔진 서비스에서는 하나의 문서가 변경되었을때, 색인이 변경되는데 많은 시간이 소요되고 그 사이에 일관성이 추구되지 않을수 있다.
5. 검색엔진 아키텍쳐
-
5.1 검색엔진 시스템이란?
컴퓨터 시스템에 저장된 정보를 찾아주는 것을 도와주도록 설계된 정보 검색 시스템 (위키피디아)
- 5.2 검색 서비스로서의 검색엔진 vs 프로그램으로서의 검색엔진
- 검색 서비스 로서의 검색엔진
- 검색엔진을 기반으로 구축한 검색 시스템을 활용해 검색 결과를 서비스로 제공하는것
- ex) 네이버, 구글
- 프로그램으로서의 검색엔진
- 현재 가지고 있는 데이터 중에서 특정한 데이터를 검색할 수 있는 기능을 제공하는 것
- 검색 서비스 로서의 검색엔진
- 5.3 검색 서비스 필요 요소
- 수집기
- 저장소(DB)
- 수집기가 저장한 데이터를 저장할 수 있는 저장소이다.
- 색인기
- 수집한 데이터를 색인이라는 과정을 거쳐 검색이 용이한 데이터로 만들어 주는 역할을 한다.
- 검색엔진의 색인기의 경우 주로 역색인 이라는 색인 방법을 사용한다.
- 검색기
- 색인된 단어를 검색할 수 있는 검색기이다.
- 기본적으로 검색기는 검색 순위 알고리즘을 가지고 있으며 (Elastic의 경우 Lucene에서 사용하던 TF-IDF에서 BM25로 변경) 이러한 알고리즘을 통해 더욱 적합한 검색결과를 상위에 표시할 수 있다.
- 검색 결과 제공 UI
우리가 알고자하는 엘라스틱서치의 경우 2, 3, 4의 기능을 수행한다.
- 5.4 색인 (indexing) 과 역색인 (inverted indexing)
- 색인 (단방향 색인)
- 특정한 데이터가 어느 위치에 있는지 미리 저장(정렬/나열)해두어 검색시 빠른 속도로 찾도록 돕는 행위를 말한다.
- 일반적인 SQL에서는 단방향 색인을 사용한다. 특정 키워드를 포함하고 있는 문서를 찾기 위해서 모든 내용을 읽어 키워드의 포함 여부에 대한 검사가 이루어진다. (별도의 캐싱로직을 추가하지 않으면 동일한 요청에 대해서도 같은 작업이 반복되어 이루어지게 된다.)
- 역색인
- 데이터 색인시에 조금 더 인간적인 사고와 가깝게 체계를 구성한 특수 색인 기법
- 특정 키워드(Term)로 포함하고 있는 문서들에 대한 PK를 매핑하는 인덱스 테이블을 생성하고, 이 테이블을 활용하여 빠른 문서 탐색이 가능케 된다.
- 역색인 인덱스 테이블은 주로 BTree, Trie, Hash Table 등의 자료 구조를 활용하여 구현이 된다.
- 역색인의 과정
- 색인 (단방향 색인)
- 5.5 Term 추출과 형태소 분석
- 내가 주소 사전 구축을 Elasticsearch으로 선택하게된 이유
- Elasticsearch를 포함한 대부분의 검색엔진에선 역색인 테이블을 업데이트 할때, 형태소 분석을 통해 문서에 포함된 키워드(Term)을 추출하여 업데이트를 한다.
- 사용예시
7. 참고
https://inyl.github.io/programming/2017/05/09/database.html
https://velog.io/@swhan9404/NoSQL-%EC%9D%98-%EC%A2%85%EB%A5%98%EB%B3%84-%ED%8A%B9%EC%A7%95
https://gyoogle.dev/blog/computer-science/data-base/SQL%20&%20NOSQL.html
https://medium.com/curg/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%ED%8A%B8%EB%A6%B4%EB%A0%88%EB%A7%88-be05b0c7ddc1
https://minwookchang.info/14
https://velog.io/@jakeseo_me/%EC%97%98%EB%9D%BC%EC%8A%A4%ED%8B%B1%EC%84%9C%EC%B9%98-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-1-%EC%97%98%EB%9D%BC%EC%8A%A4%ED%8B%B1%EC%84%9C%EC%B9%98%EB%8A%94-%EA%B2%80%EC%83%89%EC%97%94%EC%A7%84%EC%9D%B4%EB%8B%A4