토이 프로젝트를 준비하면서 엘라스틱서치를 사용해야하는 상황이 발생했습니다. CQRS를 참고하면서 개발하면서 Query 즉, Select하는 부분에 ElasticSearch를 선택하여 역색인 지원을 통한 매우 빠른검색을 활용하려고 하였으며 , 기존의 RDB에서는 단순 텍스트 매칭에 대한 검색만 제공하기 때문입니다. (요즘은 MySQL 의 최신버전에서는 n-gram 기반의 Full-text검색을 지원하지만 한글검색의 경우에는 아직 약한 기능을 제공한다고 합니다.)
따라서 엘라스틱 서치 실무가이드 : 한글 검색 시스템 구축부터 대용량 클러스터 운영까지
라는 책을 참고하여 공부하면서 개발하고자 하였습니다. 따라서 공부한 내용을 포스팅해보고자 합니다.
ElasticSearch Version : 7.9.1
Kibana Version : 7.9.1
ElasticSearch를 사용하기에 앞서 기본 용어들을 확인해보겠습니다.
엘라스틱서치 | 관계형 데이터 베이스 |
---|---|
인덱스(index) | 데이터베이스(database) |
샤드(Shard) | 파티션(Partition) |
타입(Type) | 테이블(Table) |
문서(Document) | 행(Row) |
필드(Field) | 열(Column) |
매핑(Mapping) | 스키마(Schema) |
QueryDSL | SQL |
위의 표는 ElasticSearch와 RDB의 주요 개념을 비교해 보여주는 표라고 보시면 됩니다.
ElasticSearch는 RDB의 Database와 비슷한 문서의 모음을 뜻합니다.
HTTP Method | 기능 | 데이터베이스의 문법 |
---|---|---|
GET | 데이터 조회 | SELECT |
POST | 인덱스 업데이트, 데이터 조회 | UPDATATE, SELECT |
PUT | 데이터 생성 | INSERT |
DELETE | 데이터 삭제 | DELETE |
HEAD | 인덱스 정보 확인 | - |
# ElasticSearch version 6.x 이하
curl -X{메서드} http://host:port/{인덱스}/{타입}/{문서 id} -d '{json 데이터}'
# ElasticSearch version 7.x 이상
# ElasticSearch 7.x 버전 이상에서는 도큐먼트 타입 개념이 사라지고 _doc로 접근해야합니다.
curl -X{메서드} http://host:port/{인덱스}/_doc/{문서 id} -d '{json 데이터}'
가장 간단하게 curl이 제대로 동작하는지 ElasticSearch버전을 가져오면서 확인해보겠습니다.
(Mac Terminal or Window CMD)
curl -XGET localhost:9200
{
"name" : "DESKTOP-86T3T08",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "oJfcli2ZRIq1b8LnyCTmrQ",
"version" : {
"number" : "7.9.1",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "083627f112ba94dffc1232e8b42b73492789ef91",
"build_date" : "2020-09-01T21:22:21.964974Z",
"build_snapshot" : false,
"lucene_version" : "8.6.2",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
다음과 같은 결과를 얻으셨다면 성공적으로 curl 을 수행했다고 볼 수 있습니다.
ElasticSearch에서의 인덱스는 RDB의 데이터베이스와 같은 데이터 저장공간을 의미합니다.
검색시 인덱스의 이름을 통해 문서 데이터를 검색할 수 있으며, 여러개의 인덱스를 동시에 검색하는것도 가능합니다.
색인된 문서는 하나의 인덱스에 담깁니다. 인덱스의 내부에 색인된 데이터는 물리적인 공간에 여러 개의 파티션으로 나뉘어 구성되는데, 이 파티션을 ElasticSearch에서는 샤드라고 부릅니다. ElasticSearch는 다수의 샤드로 문서를 분산 저장하고 있어 데이터의 손실 위험을 최소화 할 수 있습니다.
타입은 인덱스의 논리적 구조를 의미합니다. ElasticSearych 6.0 버전 이하에서는 하나의 인덱스에 여러 타입을 설정 가능하였지만 6.1버전부터는 인덱스당 하나의 타입만 사용가능하다고 합니다. 현재는 7.x 버전 이상에서는 타입이 삭제되었습니다. 따라서 Type을 구분해야 한다면 별도의 인덱스를 구성하여 사용해야 합니다.
문서(Document)는 ElasticSearch를 포스팅 하면서 가장 많이 사용될것이며 저는 Document라고 표현하겠습니다.
Document는 데이터가 저장되는 최소 단위라고 합니다. 기본적으로 JSON 포맷으로 데이터가 저장되며, RDB로 보자면 row와 같습니다. 하나의 Document에는 다수의 필드로 구성되어있는데 각 필드는 데이터의 형태에 따라 용도에 맞는 데이터 타입을 갖는다.
필드는 문서를 구성하기 위한 속성이라고 할 수 있다. RDB의 컬럼과 비교할 수있으나 RDB의 컬럼은 정적인 데이터 타입인 데 반해 필드는 좀더 동적인 데이터 타입이라고 할 수 있다.
매핑은 문서의 필드와 필드의 속성을 정의하고 그에 따른 색인 방법을 정의하는 프로세스입니다.
인덱스의 필드에는 여러가지의 데이터 타입을 지정할 수 있지만 , 필드명은 중복해서 사용 할 수 없다.
| [엘라스틱서치 알아보기 #2] DB만 있으면 되는데, 왜 굳이 검색엔진?](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-2-DB%EB%A7%8C-%EC%9E%88%EC%9C%BC%EB%A9%B4-%EB%90%98%EB%8A%94%EB%8D%B0-%EC%99%9C-%EA%B5%B3%EC%9D%B4-%EA%B2%80%EC%83%89%EC%97%94%EC%A7%84)