작성하는 ElasticSearch는 7.15.3 버전을 기준으로 포스팅합니다.
ElasticSearch 와 Kibana 는 미리 설치해주세요.!
대부분의 개발자들이 MySQL 은 많이 사용해봤지만, ElasticSearch 등 NoSQL은 많이 접하지 않았을거라 생각한다. 나 또한 ElasticSearch를 처음 접할 때 그래서 MySQL로 어떤 쿼리인데?
가 가장 궁금했었다.
회사에서 통계를 MySQL -> ElasticSearch 로 이전하면서 (10/10 기준) 2개월동안 실무에서 사용했던
ES지식/쿼리를 MySQL 과 비교하여 설명해본다.
ES와 MySQL 에서 용어도 차이가 있으니, 용어에 대한 설명은 구글 검색을 통해 미리 익혀놓는게 좋다.
앞으로 (간단히) 사용하게 될 데이터 모델이다.
CREATE TABLE Person(
personId INT(11) NOT NULL,
name VARCHAR(20) NOT NULL,
gender VARCHAR(1) NULL,
age SMALLINT,
CONSTRAINT personTable_PK PRIMARY KEY(personId)
);
CREATE TABLE Address(
personId INT(11) NOT NULL,
country VARCHAR(20) NOT NULL,
city VARCHAR(20) NULL,
);
관계
에 중점을 두는 관계형 데이터베이스 (RDBMS) 인 반면에 ElasticSearch 같은 document 기반 NoSql 은 데이터 모델에 중점을 두기 때문에 Join연산은 고려되지 않는다.노드의 개수
로 설정한다. GET /_nodes/stats
를 통해 노드의 개수를 확인해보자.PUT /person
{
"settings": {
"number_of_shards": 3, << 반드시 GET /_nodes/stats 에서 나온 노드의 개수 입력
"number_of_replicas": 1
},
"mappings": {
"properties": {
"_class": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"personId": {
"type": "keyword"
},
"name": {
"type": "keyword"
},
"gender": {
"type": "keyword"
},
"age": {
"type": "integer"
},
"address": {
"type": "nested",
"properties": {
"personId": {
"type": "keyword"
},
"country": {
"type": "keyword"
},
"city": {
"type": "keyword"
}
}
}
}
}
}
DROP TABLE `Person`;
DROP TABLE `Address`;
DELETE /person
INSERT INTO Person(personId, name, gender, age)
VALUES(1, '김이름', 'M', 27);
INSERT INTO Address(personId, country, city)
VALUES(1, 'KR', 'Suwon');
PUT person/_doc/1
{
"name":"김이름",
"gender":"M",
"age": 27,
"address": {
"personId": 1,
"country": "KR",
"city": "Suwon"
}
}
SELECT *
FROM Person
WHERE age = 27;
GET person/_search
{
"query": {
"bool": {
"filter": [
{
"term": {"age": "27"}
}
]
}
}
}
UPDATE Person
SET age = 28
WHERE personId = 1
PUT person/_doc/1
{
"age": 28
}
DELETE
FROM Person
WHERE personId = 1
DELETE /person/_doc/1
오늘은 MySQL 과 ES를 비교하며 가장 간단한 CRUD 쿼리에 대해 알아보았다. 앞으로는 조금 더 복잡한 쿼리와 집계함수에 대해 알아본다.
Reference
Nested: https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html