Ver3.0 ๐ Elasticsearch: ์ ๋ฌธ ๊ฒ์ ์์ง ๊ตฌ์ถ์ผ๋ก ๋ฐ์ดํฐ ๊ฒ์์ ์๋ก์ด ์ธ๊ณ๋ฅผ ์ด๋ค

๐ Elasticsearch: ์ ๋ฌธ ๊ฒ์ ์์ง ๊ตฌ์ถ์ผ๋ก ๋ฐ์ดํฐ ๊ฒ์์ ์๋ก์ด ์ธ๊ณ๋ฅผ ์ด๋ค
๋น ๋ฅด๊ณ ์ ํํ ๊ฒ์ ์์คํ , ์ด์ ์ง์ ๋ง๋ค์ด๋ณด์!
์๋
! ๐ ์ค๋์ ์ ๋ง ์ฌ๋ฏธ์๋ ์ฃผ์ ๋ฅผ ๊ฐ์ง๊ณ ์์ด. ๋ฐ๋ก Elasticsearch๋ผ๋ ๋
์์ธ๋ฐ, ์ด๊ฒ ๋ญ๋๋ฉด ์ฐ๋ฆฌ๊ฐ ๋งค์ผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ธฐ๋ฅ์ ์์ฒญ๋๊ฒ ๊ฐ๋ ฅํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ๋๊ตฌ์ผ. ๊ตฌ๊ธ์ฒ๋ผ ๋น ๋ฅด๊ณ ์ ํํ ๊ฒ์ ์์คํ
์ ์ง์ ๋ง๋ค ์ ์๋ค๋ฉด? ์์๋ง ํด๋ ๋ฉ์ง์ง ์์? ๐
์์ฆ ๋ฐ์ดํฐ๋ ํญ๋ฐ์ ์ผ๋ก ์ฆ๊ฐํ๊ณ ์์ด. ์๋ฐฑ๋ง, ์์ฒ๋ง ๊ฑด์ ๋ฐ์ดํฐ ์์์ ๋ด๊ฐ ์ํ๋ ์ ๋ณด๋ฅผ 0.1์ด ๋ง์ ์ฐพ์๋ด๋ ๊ฑด ๋ง๋ฒ ๊ฐ์ ์ผ์ด์ง. ๊ทธ๋ฐ๋ฐ Elasticsearch๋ ๋ฐ๋ก ๊ทธ ๋ง๋ฒ์ ํ์ค๋ก ๋ง๋ค์ด์ฃผ๋ ๋๊ตฌ๋๋ค! ์ด ๊ธ์์๋ Elasticsearch๊ฐ ๋ญ์ง, ์ด๋ป๊ฒ ์๋ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก ์ด๋ป๊ฒ ๊ตฌ์ถํ๋์ง๊น์ง ์น๊ตฌ์ฒ๋ผ ํธํ๊ฒ ์ค๋ช
ํด์ค๊ฒ. ์ค๋น๋์ด? ๐ฏ
๐ฏ Elasticsearch๊ฐ ๋ญ๊ธธ๋?
์, ๋จผ์ Elasticsearch๊ฐ ์ ํํ ๋ญ์ง๋ถํฐ ์์๋ณด์. ๊ฐ๋จํ๊ฒ ๋งํ๋ฉด ์คํ์์ค ๊ธฐ๋ฐ์ ๋ถ์ฐํ ๊ฒ์ ๋ฐ ๋ถ์ ์์ง์ด์ผ. ์ด๋ ต๊ฒ ๋ค๋ฆฌ์ง? ์ฝ๊ฒ ํ์ด์ ์ค๋ช
ํด์ค๊ฒ! ๐ค
์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค(MySQL, PostgreSQL ๊ฐ์)๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐ๋ ์ ๋ง ํ๋ฅญํด. ํ์ง๋ง ๊ฒ์ ๊ธฐ๋ฅ์์๋ ํ๊ณ๊ฐ ์์ด. ํนํ ํ
์คํธ ๊ฒ์์ด๋ ๋ณต์กํ ์กฐ๊ฑด์ ๊ฒ์์์๋ ์๋๊ฐ ๋๋ ค์ง๊ฑฐ๋ ์ ํ๋๊ฐ ๋จ์ด์ง ์ ์์ง.
๋ฐ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ์ํ ๊ฒ Elasticsearch์ผ! ์ด ๋
์์ ๊ฒ์์ ํนํ๋์ด ์์ด์, ์์ฒญ๋ ์์ ๋ฐ์ดํฐ ์์์๋ ๋ฒ๊ฐ์ฒ๋ผ ๋น ๋ฅด๊ฒ ์ํ๋ ์ ๋ณด๋ฅผ ์ฐพ์๋ผ ์ ์์ด. โก
๐ก Elasticsearch์ ํต์ฌ ํน์ง
1. ์ค์๊ฐ ๊ฒ์: ๋ฐ์ดํฐ๋ฅผ ์์ธ(Index)ํ๋ฉด ๊ฑฐ์ ์ฆ์ ๊ฒ์์ด ๊ฐ๋ฅํด
2. ๋ถ์ฐ ์ฒ๋ฆฌ: ์ฌ๋ฌ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฐ์์ผ ์ฒ๋ฆฌ ์๋๋ฅผ ๊ทน๋ํํด
3. RESTful API: HTTP ๊ธฐ๋ฐ์ ๊ฐ๋จํ API๋ก ๋๊ตฌ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ด
4. ์คํค๋ง ํ๋ฆฌ: ์๊ฒฉํ ์คํค๋ง ์์ด ์ ์ฐํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ด
5. ์ ๋ฌธ ๊ฒ์: ์์ฐ์ด ์ฒ๋ฆฌ, ํํ์ ๋ถ์ ๋ฑ ๊ณ ๊ธ ๊ฒ์ ๊ธฐ๋ฅ์ ์ ๊ณตํด
๐ ์ฌ๋ฅ๋ท ํ: Elasticsearch ๊ฐ์ ์ ๋ฌธ ๊ธฐ์ ์ ๋ฐฐ์ฐ๊ณ ์ถ๋ค๋ฉด ์ฌ๋ฅ๋ท(https://www.jaenung.net)์์ ์ค๋ฌด ๊ฒฝํ์ด ํ๋ถํ ์ ๋ฌธ๊ฐ๋ค์ ๊ฐ์๋ฅผ ์ฐพ์๋ณผ ์ ์์ด. ์ด๋ก ๋ง์ผ๋ก๋ ๋ถ์กฑํ ์ค์ ๋ ธํ์ฐ๋ฅผ ๋ฐฐ์ธ ์ ์๋ ์ข์ ๊ธฐํ์ง!
๐๏ธ Elasticsearch์ ๊ธฐ๋ณธ ๊ตฌ์กฐ ์ดํดํ๊ธฐ
Elasticsearch๋ฅผ ์ ๋๋ก ํ์ฉํ๋ ค๋ฉด ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ๊ฒ ์ ๋ง ์ค์ํด. ๋ง์น ์ง์ ์ง๊ธฐ ์ ์ ์ค๊ณ๋๋ฅผ ๋ณด๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ผ! ํ๋์ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ์์๋ณด์. ๐
ํด๋ฌ์คํฐ (Cluster)
ํด๋ฌ์คํฐ๋ Elasticsearch์ ๊ฐ์ฅ ํฐ ๋จ์์ผ. ํ๋ ์ด์์ ๋ ธ๋(์๋ฒ)๊ฐ ๋ชจ์ฌ์ ํ๋์ ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ์ง. ํด๋ฌ์คํฐ๋ ๊ณ ์ ํ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์๊ณ , ์ด ์ด๋ฆ์ผ๋ก ๋ ธ๋๋ค์ด ์ด๋ ํด๋ฌ์คํฐ์ ์ํ ์ง ๊ฒฐ์ ๋ผ. ๊ธฐ๋ณธ ์ด๋ฆ์ "elasticsearch"์ธ๋ฐ, ์ค์ ์ด์ ํ๊ฒฝ์์๋ ์๋ฏธ ์๋ ์ด๋ฆ์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฒ ์ข์!
๋ ธ๋ (Node)
๋
ธ๋๋ ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฐ๋ณ ์๋ฒ์ผ. ๊ฐ ๋
ธ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ ์์
์ ์ํํด. ๋
ธ๋๋ ์ฌ๋ฌ ์ข
๋ฅ๊ฐ ์๋๋ฐ:
โข Master Node: ํด๋ฌ์คํฐ ์ ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ ๋ฆฌ๋ ๋
ธ๋
โข Data Node: ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ ์์
์ ์ํํ๋ ๋
ธ๋
โข Ingest Node: ๋ฐ์ดํฐ๋ฅผ ์ ์ฒ๋ฆฌํ๋ ๋
ธ๋
โข Coordinating Node: ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ฐ์ ์ ์ ํ ๋
ธ๋๋ก ๋ผ์ฐํ
ํ๋ ๋
ธ๋
์ธ๋ฑ์ค (Index)
์ธ๋ฑ์ค๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ '๋ฐ์ดํฐ๋ฒ ์ด์ค'์ ๋น์ทํ ๊ฐ๋ ์ด์ผ. ๋น์ทํ ํน์ฑ์ ๊ฐ์ง ๋ฌธ์๋ค์ ๋ชจ์์ด์ง. ์๋ฅผ ๋ค์ด, ๋ธ๋ก๊ทธ ๊ธ์ ์ ์ฅํ๋ค๋ฉด "blog_posts"๋ผ๋ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค ์ ์์ด. ์ธ๋ฑ์ค ์ด๋ฆ์ ๋ฐ๋์ ์๋ฌธ์๋ก ์์ฑํด์ผ ํ๊ณ , ํน์๋ฌธ์ ์ฌ์ฉ์ ์ ํ์ด ์์ผ๋ ์ฃผ์ํด์ผ ํด! ๐
๋ฌธ์ (Document)
๋ฌธ์๋ Elasticsearch์์ ์ ์ฅ๋๋ ๊ธฐ๋ณธ ๋จ์์ผ. JSON ํ์์ผ๋ก ์ ์ฅ๋๋ฉฐ, ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ 'ํ(Row)'๊ณผ ๋น์ทํด. ๊ฐ ๋ฌธ์๋ ๊ณ ์ ํ ID๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ์ฌ๋ฌ ํ๋(Field)๋ก ๊ตฌ์ฑ๋์ด ์์ด. ๋ฌธ์๋ ์ค์ ๋ก ๊ฒ์ํ๊ณ ์กฐํํ๋ ๋ฐ์ดํฐ์ ์ต์ ๋จ์๋ผ๊ณ ์๊ฐํ๋ฉด ๋ผ!
์ค๋ (Shard)
์ค๋๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ๋ฌ ์กฐ๊ฐ์ผ๋ก ๋๋ ๊ฒ์ด์ผ. ์ ๋๋๊น? ๋ฐ์ดํฐ๊ฐ ๋๋ฌด ๋ง์์ง๋ฉด ํ ์๋ฒ์ ๋ค ๋ด์ ์ ์์์? ๊ทธ๋์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์ค๋๋ก ๋๋ ์ ์ฌ๋ฌ ๋
ธ๋์ ๋ถ์ฐ ์ ์ฅํ๋ ๊ฑฐ์ผ. ์ด๋ ๊ฒ ํ๋ฉด ๊ฒ์ ์๋๋ ๋นจ๋ผ์ง๊ณ , ๋ฐ์ดํฐ ์ฉ๋ ์ ํ๋ ์์ด์ ธ! ๐
์ค๋์๋ ๋ ๊ฐ์ง ์ข
๋ฅ๊ฐ ์์ด:
โข Primary Shard: ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ ์ค๋
โข Replica Shard: Primary Shard์ ๋ณต์ฌ๋ณธ์ผ๋ก, ์ฅ์ ๋๋น์ฉ์ด์ผ
| ๊ตฌ์ฑ์์ | ์ค๋ช | ๋น์ |
|---|---|---|
| Cluster | ์ ์ฒด ์์คํ | ๋์๊ด ์ ์ฒด |
| Node | ๊ฐ๋ณ ์๋ฒ | ๊ฐ๊ฐ์ ์๊ฐ |
| Index | ๋ฐ์ดํฐ ๋ชจ์ | ํน์ ์ฃผ์ ์ ์ฑ ๋ชจ์ |
| Document | ๊ฐ๋ณ ๋ฐ์ดํฐ | ํ ๊ถ์ ์ฑ |
| Shard | ๋ฐ์ดํฐ ์กฐ๊ฐ | ์ฑ ์ ๊ฐ ์ฑํฐ |
โ๏ธ Elasticsearch ์ค์นํ๊ณ ์์ํ๊ธฐ
์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก Elasticsearch๋ฅผ ์ค์นํด๋ณด์! ์๊ฐ๋ณด๋ค ์ด๋ ต์ง ์์ผ๋๊น ๊ฑฑ์ ํ์ง ๋ง. ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐ๋ผ์ค๋ฉด ๋ผ! ๐
๐ ์ฌ์ ์ค๋น์ฌํญ
Elasticsearch๋ Java๋ก ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์ Java๊ฐ ํ์ํด. Java 8 ์ด์ ๋ฒ์ ์ด ์ค์น๋์ด ์์ด์ผ ํด. ์ต์ ๋ฒ์ ์ Elasticsearch๋ ์์ฒด์ ์ผ๋ก JDK๋ฅผ ํฌํจํ๊ณ ์์ด์ ๋ณ๋ ์ค์น๊ฐ ํ์ ์์ ์๋ ์์ด!
๐ง Linux/Mac์์ ์ค์นํ๊ธฐ
# Elasticsearch ๋ค์ด๋ก๋
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.11.0-linux-x86_64.tar.gz
# ์์ถ ํด์
tar -xzf elasticsearch-8.11.0-linux-x86_64.tar.gz
# ๋๋ ํ ๋ฆฌ ์ด๋
cd elasticsearch-8.11.0
# Elasticsearch ์คํ
./bin/elasticsearch
๐ช Windows์์ ์ค์นํ๊ธฐ
Windows์์๋ ZIP ํ์ผ์ ๋ค์ด๋ก๋ํด์ ์์ถ์ ํ๊ณ , bin ํด๋์ ์๋ elasticsearch.bat ํ์ผ์ ์คํํ๋ฉด ๋ผ. ์ ๋ง ๊ฐ๋จํ์ง? ๐ป
# ์์ถ ํด์ ํ bin ํด๋๋ก ์ด๋
cd elasticsearch-8.11.0\bin
# Elasticsearch ์คํ
elasticsearch.bat
โจ ์คํ ํ์ธํ๊ธฐ
Elasticsearch๊ฐ ์ ์์ ์ผ๋ก ์คํ๋์๋์ง ํ์ธํ๋ ค๋ฉด ์น ๋ธ๋ผ์ฐ์ ๋ curl ๋ช
๋ น์ด๋ก http://localhost:9200 ์ ์ ์ํด๋ด. JSON ํ์์ ์๋ต์ด ์ค๋ฉด ์ฑ๊ณต์ด์ผ!
curl -X GET "localhost:9200/"
์ ์์ ์ผ๋ก ์คํ๋๋ฉด ์ด๋ฐ ์๋ต์ ๋ฐ์ ์ ์์ด:
{
"name" : "node-1",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "abc123def456",
"version" : {
"number" : "8.11.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "abc123",
"build_date" : "2023-11-01T00:00:00.000Z",
"build_snapshot" : false,
"lucene_version" : "9.8.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
โ ๏ธ ๋ณด์ ์ฃผ์์ฌํญ
Elasticsearch 8.x ๋ฒ์ ๋ถํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณด์ ๊ธฐ๋ฅ์ด ํ์ฑํ๋์ด ์์ด. ์ฒ์ ์คํํ ๋ ์๋์ผ๋ก ์์ฑ๋๋ ๋น๋ฐ๋ฒํธ์ ํ ํฐ์ ์ ๋ณด๊ดํด์ผ ํด. ์ค์ต ํ๊ฒฝ์์๋ ๋ณด์์ ๋นํ์ฑํํ ์๋ ์์ง๋ง, ์ด์ ํ๊ฒฝ์์๋ ์ ๋ ๊ทธ๋ฌ๋ฉด ์ ๋ผ!
๐ ์ธ๋ฑ์ค ์์ฑ๊ณผ ๋ฐ์ดํฐ ์์ธํ๊ธฐ
Elasticsearch๊ฐ ์คํ๋์์ผ๋ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด๋ณด์! ๋จผ์ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ์์ ๋ฌธ์๋ฅผ ์ ์ฅํ๋ ๊ณผ์ ์ ๋ฐฐ์๋ณผ๊ฒ. ๐จ
๐ ์ธ๋ฑ์ค ์์ฑํ๊ธฐ
์ธ๋ฑ์ค๋ฅผ ๋ง๋๋ ๊ฑด ์ ๋ง ๊ฐ๋จํด. RESTful API๋ฅผ ์ฌ์ฉํด์ PUT ์์ฒญ์ ๋ณด๋ด๋ฉด ๋ผ. ์๋ฅผ ๋ค์ด, ๋ธ๋ก๊ทธ ํฌ์คํธ๋ฅผ ์ ์ฅํ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค์ด๋ณด์:
PUT /blog_posts
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "standard"
},
"content": {
"type": "text",
"analyzer": "standard"
},
"author": {
"type": "keyword"
},
"published_date": {
"type": "date"
},
"tags": {
"type": "keyword"
},
"views": {
"type": "integer"
}
}
}
}
์ ์ฝ๋๋ฅผ ํ๋์ฉ ๋ฏ์ด๋ณด์:
โข settings: ์ธ๋ฑ์ค์ ์ค์ ์ ์ ์ํด. ์ค๋ ๊ฐ์์ ๋ณต์ ๋ณธ ๊ฐ์๋ฅผ ์ง์ ํ ์ ์์ด
โข mappings: ๋ฌธ์์ ๊ตฌ์กฐ๋ฅผ ์ ์ํด. ๊ฐ ํ๋์ ๋ฐ์ดํฐ ํ์
์ ์ง์ ํ์ง
โข properties: ์ค์ ํ๋๋ค์ ์ ์ํ๋ ๋ถ๋ถ์ด์ผ
๐ค ์ฃผ์ ๋ฐ์ดํฐ ํ์
text: ์ ๋ฌธ ๊ฒ์์ด ๊ฐ๋ฅํ ํ
์คํธ (๋ถ์๋จ)
keyword: ์ ํํ ์ผ์นํ๋ ๊ฒ์์ฉ ํ
์คํธ (๋ถ์ ์ ๋จ)
date: ๋ ์ง/์๊ฐ ๋ฐ์ดํฐ
integer/long: ์ ์ํ ์ซ์
float/double: ์ค์ํ ์ซ์
boolean: true/false ๊ฐ
object: ์ค์ฒฉ๋ JSON ๊ฐ์ฒด
nested: ๋ฐฐ์ด ํํ์ ๋ณต์กํ ๊ฐ์ฒด
๐ฅ ๋ฌธ์ ์์ธํ๊ธฐ
์ด์ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด๋ณด์! ๋ฌธ์๋ฅผ ์์ธํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋ ๊ฐ์ง๊ฐ ์์ด:
๋ฐฉ๋ฒ 1: ID๋ฅผ ์ง์ ์ง์ ํ๊ธฐ
PUT /blog_posts/_doc/1
{
"title": "Elasticsearch ์์ํ๊ธฐ",
"content": "Elasticsearch๋ ๊ฐ๋ ฅํ ๊ฒ์ ์์ง์
๋๋ค. ์ด ๊ธ์์๋ ๊ธฐ๋ณธ ๊ฐ๋
๋ถํฐ ์ค์ ํ์ฉ๊น์ง ๋ค๋ฃน๋๋ค.",
"author": "๊น๊ฐ๋ฐ",
"published_date": "2024-01-15",
"tags": ["elasticsearch", "๊ฒ์์์ง", "๋น
๋ฐ์ดํฐ"],
"views": 1250
}
๋ฐฉ๋ฒ 2: ID ์๋ ์์ฑํ๊ธฐ
POST /blog_posts/_doc
{
"title": "์ค์ Elasticsearch ํ์ฉ๋ฒ",
"content": "์ค๋ฌด์์ Elasticsearch๋ฅผ ์ด๋ป๊ฒ ํ์ฉํ๋์ง ๊ตฌ์ฒด์ ์ธ ์์ ์ ํจ๊ป ์์๋ด
๋๋ค.",
"author": "๋ฐ๋ฐ์ดํฐ",
"published_date": "2024-01-16",
"tags": ["elasticsearch", "์ค์ ", "ํํ ๋ฆฌ์ผ"],
"views": 890
}
๐ก PUT vs POST
PUT์ ID๋ฅผ ์ง์ ์ง์ ํ ๋ ์ฌ์ฉํ๊ณ , POST๋ Elasticsearch๊ฐ ์๋์ผ๋ก ID๋ฅผ ์์ฑํ๊ฒ ํ ๋ ์ฌ์ฉํด. PUT์ ๊ฐ์ ID๋ก ๋ค์ ์์ฒญํ๋ฉด ๊ธฐ์กด ๋ฌธ์๋ฅผ ๋ฎ์ด์ฐ์ง๋ง, POST๋ ํญ์ ์๋ก์ด ๋ฌธ์๋ฅผ ์์ฑํด!
๐ ๋๋ ๋ฐ์ดํฐ ์์ธํ๊ธฐ (Bulk API)
ํ ๋ฒ์ ์ฌ๋ฌ ๋ฌธ์๋ฅผ ์์ธํด์ผ ํ ๋๋ Bulk API๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์ฌ ํจ์จ์ ์ด์ผ. ๋คํธ์ํฌ ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์๊ฑฐ๋ ! ๐ช
POST /blog_posts/_bulk
{"index":{"_id":"2"}}
{"title":"Elasticsearch ์ฑ๋ฅ ์ต์ ํ","content":"๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ฑ๋ฅ ์ต์ ํ ๊ธฐ๋ฒ","author":"์ด์ฑ๋ฅ","published_date":"2024-01-17","tags":["์ฑ๋ฅ","์ต์ ํ"],"views":2100}
{"index":{"_id":"3"}}
{"title":"Elasticsearch ๋ณด์ ์ค์ ","content":"์ด์ ํ๊ฒฝ์์ ํ์์ ์ธ ๋ณด์ ์ค์ ๋ฐฉ๋ฒ","author":"์ต๋ณด์","published_date":"2024-01-18","tags":["๋ณด์","์ด์"],"views":1580}
{"index":{"_id":"4"}}
{"title":"Elasticsearch ํด๋ฌ์คํฐ ๊ตฌ์ถ","content":"๊ณ ๊ฐ์ฉ์ฑ์ ์ํ ํด๋ฌ์คํฐ ๊ตฌ์ถ ๊ฐ์ด๋","author":"์ ํด๋ฌ์คํฐ","published_date":"2024-01-19","tags":["ํด๋ฌ์คํฐ","๊ณ ๊ฐ์ฉ์ฑ"],"views":1920}
Bulk API๋ ํ ์ค์ ๋ช ๋ น์ด, ๋ค์ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋ ํ์์ด์ผ. ์ฃผ์ํ ์ ์ ๋ง์ง๋ง์ ๋ฐ๋์ ์ค๋ฐ๊ฟ์ด ์์ด์ผ ํ๋ค๋ ๊ฑฐ! ๐ฏ
๐ ๊ฒ์ ์ฟผ๋ฆฌ ๋ง์คํฐํ๊ธฐ
๋๋์ด ๊ฐ์ฅ ์ฌ๋ฏธ์๋ ๋ถ๋ถ์ด์ผ! ๊ฒ์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์. Elasticsearch์ ์ง์ ํ ํ์ ๋ฐ๋ก ์ฌ๊ธฐ์ ์์ด! โก
๐ฏ ๊ธฐ๋ณธ ๊ฒ์ (Match Query)
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ฒ์ ๋ฐฉ๋ฒ์ Match Query์ผ. ํน์ ํ๋์์ ํค์๋๋ฅผ ๊ฒ์ํ ๋ ์ฌ์ฉํด:
GET /blog_posts/_search
{
"query": {
"match": {
"content": "๊ฒ์ ์์ง"
}
}
}
์ด ์ฟผ๋ฆฌ๋ content ํ๋์์ "๊ฒ์" ๋๋ "์์ง"์ด๋ผ๋ ๋จ์ด๊ฐ ํฌํจ๋ ๋ชจ๋ ๋ฌธ์๋ฅผ ์ฐพ์์ค. Elasticsearch๋ ์๋์ผ๋ก ํ ์คํธ๋ฅผ ๋ถ์ํด์ ๊ฒ์ํ๊ธฐ ๋๋ฌธ์ ์ ํํ ์ผ์นํ์ง ์์๋ ๊ด๋ จ ๋ฌธ์๋ฅผ ์ฐพ์ ์ ์์ด! ๐จ
๐ช ๋ณตํฉ ๊ฒ์ (Bool Query)
์ค์ ์๋น์ค์์๋ ์ฌ๋ฌ ์กฐ๊ฑด์ ์กฐํฉํด์ ๊ฒ์ํด์ผ ํ ๋๊ฐ ๋ง์. ์ด๋ด ๋ Bool Query๋ฅผ ์ฌ์ฉํ๋ฉด ๋ผ:
GET /blog_posts/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"content": "elasticsearch"
}
}
],
"filter": [
{
"range": {
"views": {
"gte": 1000
}
}
}
],
"should": [
{
"match": {
"tags": "์ค์ "
}
}
],
"must_not": [
{
"match": {
"author": "ํ
์คํธ"
}
}
]
}
}
}
๐ง Bool Query ๊ตฌ์ฑ์์
must: ๋ฐ๋์ ์ผ์นํด์ผ ํ๋ ์กฐ๊ฑด (AND ์ฐ์ฐ, ์ ์์ ์ํฅ)
filter: ๋ฐ๋์ ์ผ์นํด์ผ ํ์ง๋ง ์ ์์๋ ์ํฅ ์์ (์ฑ๋ฅ ์ข์)
should: ์ผ์นํ๋ฉด ์ข์ ์กฐ๊ฑด (OR ์ฐ์ฐ, ์ ์ ํฅ์)
must_not: ์ผ์นํ๋ฉด ์ ๋๋ ์กฐ๊ฑด (NOT ์ฐ์ฐ)
๐ฏ ์ ํํ ๊ฒ์ (Term Query)
keyword ํ์ ํ๋์์ ์ ํํ ์ผ์นํ๋ ๊ฐ์ ์ฐพ์ ๋๋ Term Query๋ฅผ ์ฌ์ฉํด:
GET /blog_posts/_search
{
"query": {
"term": {
"author": "๊น๊ฐ๋ฐ"
}
}
}
๐ ๋ฒ์ ๊ฒ์ (Range Query)
๋ ์ง๋ ์ซ์ ๋ฒ์๋ก ๊ฒ์ํ ๋๋ Range Query๊ฐ ์ ์ฉํด:
GET /blog_posts/_search
{
"query": {
"range": {
"published_date": {
"gte": "2024-01-01",
"lte": "2024-01-31"
}
}
}
}
๐
Range Query ์ฐ์ฐ์
gte: ํฌ๊ฑฐ๋ ๊ฐ์ (Greater Than or Equal)
gt: ํผ (Greater Than)
lte: ์๊ฑฐ๋ ๊ฐ์ (Less Than or Equal)
lt: ์์ (Less Than)
๐ ์์ผ๋์นด๋ ๊ฒ์ (Wildcard Query)
๋ถ๋ถ ์ผ์น ๊ฒ์์ด ํ์ํ ๋๋ Wildcard Query๋ฅผ ์ฌ์ฉํ ์ ์์ด. ํ์ง๋ง ์ฑ๋ฅ์ด ์ข์ง ์์ผ๋ ๊ผญ ํ์ํ ๋๋ง ์ฌ์ฉํ๋ ๊ฒ ์ข์!
GET /blog_posts/_search
{
"query": {
"wildcard": {
"title": "*elastic*"
}
}
}
๐จ ํผ์ง ๊ฒ์ (Fuzzy Query)
์คํ๊ฐ ์์ด๋ ๊ฒ์ํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ Fuzzy Query์ผ. ์ฌ์ฉ์๊ฐ ์ฒ ์๋ฅผ ํ๋ ค๋ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์ ์ ์์ด! ๐
GET /blog_posts/_search
{
"query": {
"fuzzy": {
"title": {
"value": "elasticsarch",
"fuzziness": "AUTO"
}
}
}
}
"elasticsarch"๋ผ๊ณ ์๋ชป ์ ๋ ฅํด๋ "elasticsearch"๋ฅผ ์ฐพ์์ค! fuzziness ๊ฐ์ ํ์ฉํ ํธ์ง ๊ฑฐ๋ฆฌ๋ฅผ ์๋ฏธํ๋๋ฐ, "AUTO"๋ก ์ค์ ํ๋ฉด Elasticsearch๊ฐ ์๋์ผ๋ก ์ ์ ํ ๊ฐ์ ์ ํํด์ค. ๐ฏ
๐ ์ง๊ณ์ ๋ถ์ (Aggregations)
Elasticsearch๋ ๋จ์ํ ๊ฒ์๋ง ํ๋ ๊ฒ ์๋์ผ. ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๊ณ ํต๊ณ๋ฅผ ๋ด๋ ๊ฐ๋ ฅํ ์ง๊ณ(Aggregation) ๊ธฐ๋ฅ๋ ์ ๊ณตํด! ์ด๊ฑด ์ ๋ง ์ ์ฉํ ๊ธฐ๋ฅ์ด์ผ. ๐
๐ ๋ฉํธ๋ฆญ ์ง๊ณ (Metric Aggregations)
์ซ์ ๋ฐ์ดํฐ์ ํต๊ณ๋ฅผ ๊ณ์ฐํ ๋ ์ฌ์ฉํด. ํ๊ท , ํฉ๊ณ, ์ต๋๊ฐ, ์ต์๊ฐ ๋ฑ์ ๊ตฌํ ์ ์์ด:
GET /blog_posts/_search
{
"size": 0,
"aggs": {
"avg_views": {
"avg": {
"field": "views"
}
},
"max_views": {
"max": {
"field": "views"
}
},
"min_views": {
"min": {
"field": "views"
}
},
"total_views": {
"sum": {
"field": "views"
}
}
}
}
"size": 0์ผ๋ก ์ค์ ํ๋ฉด ๊ฒ์ ๊ฒฐ๊ณผ๋ ๋ฐํํ์ง ์๊ณ ์ง๊ณ ๊ฒฐ๊ณผ๋ง ๋ฐ์ ์ ์์ด. ๋ถํ์ํ ๋ฐ์ดํฐ ์ ์ก์ ์ค์ผ ์ ์์ง! ๐ก
๐๏ธ ๋ฒํท ์ง๊ณ (Bucket Aggregations)
๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃน์ผ๋ก ๋๋ ์ ๋ถ์ํ ๋ ์ฌ์ฉํด. ์๋ฅผ ๋ค์ด, ์์ฑ์๋ณ๋ก ๊ธ ๊ฐ์๋ฅผ ์ธ๊ฑฐ๋, ๋ ์ง๋ณ๋ก ํต๊ณ๋ฅผ ๋ผ ์ ์์ด:
GET /blog_posts/_search
{
"size": 0,
"aggs": {
"posts_by_author": {
"terms": {
"field": "author",
"size": 10
},
"aggs": {
"avg_views_per_author": {
"avg": {
"field": "views"
}
}
}
}
}
}
์ด ์ฟผ๋ฆฌ๋ ์์ฑ์๋ณ๋ก ๊ธ ๊ฐ์๋ฅผ ์ธ๊ณ , ๊ฐ ์์ฑ์์ ํ๊ท ์กฐํ์๋ ํจ๊ป ๊ณ์ฐํด์ค. ์ง๊ณ ์์ ์ง๊ณ๋ฅผ ์ค์ฒฉํ ์ ์๋ค๋ ๊ฒ ์ ๋ง ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ด์ผ! ๐
๐ ๋ ์ง ํ์คํ ๊ทธ๋จ
์๊ฐ๋๋ณ ํต๊ณ๋ฅผ ๋ณด๊ณ ์ถ์ ๋๋ Date Histogram์ ์ฌ์ฉํด:
GET /blog_posts/_search
{
"size": 0,
"aggs": {
"posts_over_time": {
"date_histogram": {
"field": "published_date",
"calendar_interval": "month",
"format": "yyyy-MM"
},
"aggs": {
"total_views": {
"sum": {
"field": "views"
}
}
}
}
}
}
๐ฏ ์ง๊ณ ํ์ฉ ํ
์ง๊ณ๋ ์ค์๊ฐ ๋์๋ณด๋๋ ๋ถ์ ๋ฆฌํฌํธ๋ฅผ ๋ง๋ค ๋ ์ ๋ง ์ ์ฉํด. ์๋ฅผ ๋ค์ด, ์ ์์๊ฑฐ๋ ์ฌ์ดํธ์์ ์ผ๋ณ ๋งค์ถ ํต๊ณ, ์ธ๊ธฐ ์ํ ์์, ์ง์ญ๋ณ ํ๋งค๋ ๋ฑ์ ์ค์๊ฐ์ผ๋ก ํ์ธํ ์ ์์ด!
๐จ ํ๊ธ ๊ฒ์ ์ต์ ํํ๊ธฐ
ํ๊ธ ๊ฒ์์ ์์ด์ ๋ฌ๋ฆฌ ํน๋ณํ ์ฒ๋ฆฌ๊ฐ ํ์ํด. ํํ์ ๋ถ์์ด ์ค์ํ๊ฑฐ๋ ! ์๋ฅผ ๋ค์ด, "๋จน์๋ค", "๋จน๋๋ค", "๋จน์"์ ๋ชจ๋ "๋จน๋ค"๋ผ๋ ๊ธฐ๋ณธํ์ผ๋ก ๋ถ์๋์ด์ผ ์ ๋๋ก ๊ฒ์์ด ๋ผ. ๐ฐ๐ท
๐ง Nori ๋ถ์๊ธฐ ์ค์น
Elasticsearch์์ ํ๊ธ ํํ์ ๋ถ์์ ์ํด Nori ํ๋ฌ๊ทธ์ธ์ ์ ๊ณตํด. ์ค์น๋ ์ ๋ง ๊ฐ๋จํด:
# Elasticsearch ๋๋ ํ ๋ฆฌ์์ ์คํ
./bin/elasticsearch-plugin install analysis-nori
# ์ค์น ํ์ธ
./bin/elasticsearch-plugin list
ํ๋ฌ๊ทธ์ธ์ ์ค์นํ ํ์๋ Elasticsearch๋ฅผ ์ฌ์์ํด์ผ ํด!
๐ ํ๊ธ ์ธ๋ฑ์ค ์ค์
Nori ๋ถ์๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค์ด๋ณด์:
PUT /korean_blog
{
"settings": {
"analysis": {
"tokenizer": {
"nori_user_dict": {
"type": "nori_tokenizer",
"decompound_mode": "mixed",
"user_dictionary": "userdict_ko.txt"
}
},
"analyzer": {
"korean": {
"type": "custom",
"tokenizer": "nori_user_dict",
"filter": ["lowercase", "nori_part_of_speech"]
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "korean"
},
"content": {
"type": "text",
"analyzer": "korean"
}
}
}
}
๐ Nori ๋ถ์ ๋ชจ๋
none: ๋ณตํฉ์ด๋ฅผ ๋ถํดํ์ง ์์
discard: ๋ณตํฉ์ด๋ง ์ ์ฅ (์๋ณธ ๋จ์ด ๋ฒ๋ฆผ)
mixed: ๋ณตํฉ์ด์ ๋ถํด๋ ๋จ์ด ๋ชจ๋ ์ ์ฅ (์ถ์ฒ!)
๐งช ๋ถ์๊ธฐ ํ ์คํธ
๋ถ์๊ธฐ๊ฐ ์ ๋๋ก ์๋ํ๋์ง ํ ์คํธํด๋ณผ ์ ์์ด:
POST /korean_blog/_analyze
{
"analyzer": "korean",
"text": "Elasticsearch๋ก ํ๊ธ ๊ฒ์ ์์ง์ ๋ง๋ค์์ต๋๋ค"
}
์ด ์์ฒญ์ ๋ณด๋ด๋ฉด ํ ์คํธ๊ฐ ์ด๋ป๊ฒ ํ ํฐ์ผ๋ก ๋ถํด๋๋์ง ํ์ธํ ์ ์์ด. ํํ์ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด์ ๊ฒ์ ํ์ง์ ๊ฐ์ ํ ์ ์์ง! ๐ฏ
โก ์ฑ๋ฅ ์ต์ ํ ์ ๋ต
Elasticsearch๋ฅผ ์ค์ ์๋น์ค์ ์ ์ฉํ๋ ค๋ฉด ์ฑ๋ฅ ์ต์ ํ๊ฐ ์ ๋ง ์ค์ํด. ๋ช ๊ฐ์ง ํต์ฌ ์ ๋ต์ ์๋ ค์ค๊ฒ! ๐ช
๐ฏ ์ค๋ ๊ฐ์ ์ต์ ํ
์ค๋ ๊ฐ์๋ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์ณ. ๋๋ฌด ๋ง์ผ๋ฉด ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๊ณ , ๋๋ฌด ์ ์ผ๋ฉด ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ์ด์ ์ ๋ชป ์ด๋ ค. ์ผ๋ฐ์ ์ธ ๊ฐ์ด๋๋ผ์ธ์:
๐ ์ค๋ ๊ฐ์ ๊ฐ์ด๋๋ผ์ธ
โข ๊ฐ ์ค๋์ ํฌ๊ธฐ๋ 20GB~50GB ์ ๋๊ฐ ์ ๋นํด
โข ๋
ธ๋๋น ์ค๋ ๊ฐ์๋ 20๊ฐ ์ดํ๋ก ์ ์งํ๋ ๊ฒ ์ข์
โข ์์ ์ธ๋ฑ์ค๋ ์ค๋ 1๊ฐ๋ก ์์ํด๋ ์ถฉ๋ถํด
โข ๋ฐ์ดํฐ๊ฐ ์ฆ๊ฐํ๋ฉด Reindex API๋ก ์ค๋ ๊ฐ์๋ฅผ ์กฐ์ ํ ์ ์์ด
๐พ ๋ฉ๋ชจ๋ฆฌ ์ค์
Elasticsearch๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด์ผ. JVM ํ ๋ฉ๋ชจ๋ฆฌ ์ค์ ์ด ์ค์ํด:
# ํ ๋ฉ๋ชจ๋ฆฌ ์ค์ (์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ๋์ผํ๊ฒ)
-Xms4g
-Xmx4g
# ์ฃผ์: ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ์ 50%๋ฅผ ๋์ง ์๋๋ก!
# ๋๋จธ์ง 50%๋ OS ํ์ผ ์บ์์ฉ์ผ๋ก ๋จ๊ฒจ๋ฌ์ผ ํด
โ ๏ธ ์ค์ํ ๋ฉ๋ชจ๋ฆฌ ๊ท์น
ํ ๋ฉ๋ชจ๋ฆฌ๋ ์ ๋ 32GB๋ฅผ ๋๊ธฐ๋ฉด ์ ๋ผ! 32GB๋ฅผ ๋์ผ๋ฉด JVM์ Compressed OOPs ์ต์ ํ๊ฐ ๋นํ์ฑํ๋์ด ์คํ๋ ค ์ฑ๋ฅ์ด ๋จ์ด์ ธ. ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ง์ด ํ์ํ๋ฉด ๋
ธ๋๋ฅผ ์ฌ๋ฌ ๊ฐ ์ฌ์ฉํ๋ ๊ฒ ๋์!
๐ Refresh Interval ์กฐ์
Elasticsearch๋ ๊ธฐ๋ณธ์ ์ผ๋ก 1์ด๋ง๋ค ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด(refresh). ํ์ง๋ง ๋๋ ์์ธ ์์ ์ ํ ๋๋ ์ด ๊ฐ๊ฒฉ์ ๋๋ฆฌ๋ฉด ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋ผ:
# ๋๋ ์์ธ ์์ ์
PUT /blog_posts/_settings
{
"index": {
"refresh_interval": "-1"
}
}
# ๋๋ ์์ธ ์์
์ํ...
# ์์
์๋ฃ ํ ์๋๋๋ก
PUT /blog_posts/_settings
{
"index": {
"refresh_interval": "1s"
}
}
# ์๋์ผ๋ก refresh
POST /blog_posts/_refresh
๐จ ํ๋ ์ ์ฅ ์ต์ ํ
๋ชจ๋ ํ๋๋ฅผ ์ ์ฅํ ํ์๋ ์์ด. ๊ฒ์๋ง ํ๊ณ ์๋ณธ ๋ฐ์ดํฐ๋ ํ์ ์๋ค๋ฉด _source๋ฅผ ๋นํ์ฑํํ ์ ์์ด:
PUT /logs
{
"mappings": {
"_source": {
"enabled": false
},
"properties": {
"message": {
"type": "text",
"store": true
},
"timestamp": {
"type": "date",
"store": true
}
}
}
}
ํ์ง๋ง ์ฃผ์ํด! _source๋ฅผ ๋นํ์ฑํํ๋ฉด ๋ฌธ์ ์ ๋ฐ์ดํธ๋ reindex๊ฐ ๋ถ๊ฐ๋ฅํด์ ธ. ์ ์คํ๊ฒ ๊ฒฐ์ ํด์ผ ํด! ๐ค
๐ ๊ฒ์ ์ฟผ๋ฆฌ ์ต์ ํ
1. Filter Context ํ์ฉ
์ ์ ๊ณ์ฐ์ด ํ์ ์๋ ์กฐ๊ฑด์ filter context๋ฅผ ์ฌ์ฉํด. ์บ์ฑ๋์ด ์ฑ๋ฅ์ด ํจ์ฌ ์ข์:
GET /blog_posts/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"content": "elasticsearch"
}
}
],
"filter": [
{
"term": {
"author": "๊น๊ฐ๋ฐ"
}
},
{
"range": {
"published_date": {
"gte": "2024-01-01"
}
}
}
]
}
}
}
2. ํ์ํ ํ๋๋ง ๊ฐ์ ธ์ค๊ธฐ
_source filtering์ ์ฌ์ฉํด์ ํ์ํ ํ๋๋ง ๋ฐํ๋ฐ์:
GET /blog_posts/_search
{
"_source": ["title", "author", "published_date"],
"query": {
"match_all": {}
}
}
3. ํ์ด์ง๋ค์ด์ ์ต์ ํ
๊น์ ํ์ด์ง๋ค์ด์ ์ ์ฑ๋ฅ์ด ๋๋น . Search After๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์ข์:
GET /blog_posts/_search
{
"size": 10,
"query": {
"match_all": {}
},
"sort": [
{"published_date": "desc"},
{"_id": "asc"}
],
"search_after": ["2024-01-15", "abc123"]
}
๐ก๏ธ ๋ณด์ ์ค์ ํ๊ธฐ
์ด์ ํ๊ฒฝ์์๋ ๋ณด์์ด ์ ๋ง ์ค์ํด! Elasticsearch 8.x๋ถํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณด์์ด ํ์ฑํ๋์ด ์์ง๋ง, ์ ๋๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์์์ผ ํด. ๐
๐ ์ฌ์ฉ์ ์ธ์ฆ ์ค์
Elasticsearch๋ ๊ธฐ๋ณธ์ ์ผ๋ก elastic์ด๋ผ๋ ์ํผ์ ์ ๊ณ์ ์ ์ ๊ณตํด. ์ถ๊ฐ ์ฌ์ฉ์๋ฅผ ๋ง๋ค์ด๋ณด์:
POST /_security/user/developer
{
"password" : "dev_password_123!",
"roles" : [ "developer_role" ],
"full_name" : "๊ฐ๋ฐ์",
"email" : "dev@example.com"
}
๐ฅ ์ญํ ๊ธฐ๋ฐ ์ ๊ทผ ์ ์ด
์ญํ (Role)์ ๋ง๋ค์ด์ ์ธ๋ฐํ ๊ถํ ๊ด๋ฆฌ๋ฅผ ํ ์ ์์ด:
POST /_security/role/developer_role
{
"cluster": ["monitor"],
"indices": [
{
"names": ["blog_posts", "korean_blog"],
"privileges": ["read", "write", "create_index"]
}
]
}
๐ ์ฃผ์ ๊ถํ ์ข ๋ฅ
ํด๋ฌ์คํฐ ๊ถํ:
โข all: ๋ชจ๋ ํด๋ฌ์คํฐ ์์
โข monitor: ํด๋ฌ์คํฐ ์ํ ์กฐํ
โข manage: ํด๋ฌ์คํฐ ์ค์ ๋ณ๊ฒฝ
์ธ๋ฑ์ค ๊ถํ:
โข read: ๋ฌธ์ ์กฐํ ๋ฐ ๊ฒ์
โข write: ๋ฌธ์ ์์ฑ, ์์ , ์ญ์
โข create_index: ์ธ๋ฑ์ค ์์ฑ
โข delete_index: ์ธ๋ฑ์ค ์ญ์
โข manage: ์ธ๋ฑ์ค ์ค์ ๋ณ๊ฒฝ
๐ ๋คํธ์ํฌ ๋ณด์
elasticsearch.yml ํ์ผ์์ ๋คํธ์ํฌ ์ค์ ์ ์กฐ์ ํด:
# ํน์ IP๋ง ์ ๊ทผ ํ์ฉ
network.host: 192.168.1.100
# HTTPS ํ์ฑํ
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: certs/http.p12
# ๋
ธ๋ ๊ฐ ํต์ ์ํธํ
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.keystore.path: certs/transport.p12
โ ๏ธ ๋ณด์ ์ฒดํฌ๋ฆฌ์คํธ
โ ๊ธฐ๋ณธ ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝํ๊ธฐ
โ ๋ถํ์ํ ํ๋ฌ๊ทธ์ธ ์ ๊ฑฐํ๊ธฐ
โ ๋ฐฉํ๋ฒฝ ์ค์ ํ๊ธฐ
โ ์ ๊ธฐ์ ์ธ ๋ณด์ ์
๋ฐ์ดํธ
โ ๊ฐ์ฌ ๋ก๊ทธ ํ์ฑํํ๊ธฐ
โ ๋ฐฑ์
์ ์ฑ
์๋ฆฝํ๊ธฐ
๐ง ๋ชจ๋ํฐ๋ง๊ณผ ์ ์ง๋ณด์
Elasticsearch๋ฅผ ์์ ์ ์ผ๋ก ์ด์ํ๋ ค๋ฉด ์ง์์ ์ธ ๋ชจ๋ํฐ๋ง์ด ํ์์ผ! ์ด๋ค ์งํ๋ค์ ๋ด์ผ ํ๋์ง ์์๋ณด์. ๐
๐ ํด๋ฌ์คํฐ ์ํ ํ์ธ
GET /_cluster/health
ํด๋ฌ์คํฐ ์ํ๋ ์ธ ๊ฐ์ง ์์ผ๋ก ํ์๋ผ:
๐ข Green: ๋ชจ๋ ์ค๋๊ฐ ์ ์์ ์ผ๋ก ํ ๋น๋จ (์ต์์ ์ํ)
๐ก Yellow: ๋ชจ๋ Primary ์ค๋๋ ํ ๋น๋์์ง๋ง ์ผ๋ถ Replica ์ค๋๊ฐ ํ ๋น๋์ง ์์
๐ด Red: ์ผ๋ถ Primary ์ค๋๊ฐ ํ ๋น๋์ง ์์ (๋ฐ์ดํฐ ์์ค ๊ฐ๋ฅ์ฑ)
๐พ ๋ ธ๋ ํต๊ณ ํ์ธ
GET /_nodes/stats
์ด API๋ ๊ฐ ๋ ธ๋์ CPU, ๋ฉ๋ชจ๋ฆฌ, ๋์คํฌ, JVM ์ํ ๋ฑ ์์ธํ ์ ๋ณด๋ฅผ ์ ๊ณตํด. ์ ๊ธฐ์ ์ผ๋ก ํ์ธํด์ ๋ฆฌ์์ค ๋ถ์กฑ ์ํฉ์ ๋ฏธ๋ฆฌ ํ์ ํ ์ ์์ด! ๐ฏ
๐ ์ธ๋ฑ์ค ํต๊ณ
GET /blog_posts/_stats
์ธ๋ฑ์ค๋ณ ๋ฌธ์ ๊ฐ์, ์ ์ฅ ์ฉ๋, ๊ฒ์ ํ์, ์์ธ ์๋ ๋ฑ์ ํ์ธํ ์ ์์ด. ์ด๋ค ์ธ๋ฑ์ค๊ฐ ๋ฆฌ์์ค๋ฅผ ๋ง์ด ์ฌ์ฉํ๋์ง ํ์ ํ๋ ๋ฐ ์ ์ฉํด!
๐จ ๋๋ฆฐ ์ฟผ๋ฆฌ ๋ก๊น
์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ฐพ๊ธฐ ์ํด ๋๋ฆฐ ์ฟผ๋ฆฌ๋ฅผ ๋ก๊น ํ ์ ์์ด:
PUT /blog_posts/_settings
{
"index.search.slowlog.threshold.query.warn": "10s",
"index.search.slowlog.threshold.query.info": "5s",
"index.search.slowlog.threshold.query.debug": "2s",
"index.search.slowlog.threshold.fetch.warn": "1s",
"index.indexing.slowlog.threshold.index.warn": "10s"
}
์ด๋ ๊ฒ ์ค์ ํ๋ฉด ์ง์ ํ ์๊ฐ๋ณด๋ค ์ค๋ ๊ฑธ๋ฆฌ๋ ์ฟผ๋ฆฌ๊ฐ ๋ก๊ทธ์ ๊ธฐ๋ก๋ผ. ์ฑ๋ฅ ๋ณ๋ชฉ ์ง์ ์ ์ฐพ๋ ๋ฐ ์ ๋ง ์ ์ฉํด! ๐
๐ ์ธ๋ฑ์ค ๋ผ์ดํ์ฌ์ดํด ๊ด๋ฆฌ
์๊ฐ์ด ์ง๋๋ฉด์ ์์ด๋ ๋ก๊ทธ ๋ฐ์ดํฐ ๊ฐ์ ๊ฒฝ์ฐ, ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ์ ์ฑ ์ ๋ง๋ค ์ ์์ด:
PUT /_ilm/policy/logs_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_size": "50GB",
"max_age": "7d"
}
}
},
"warm": {
"min_age": "7d",
"actions": {
"shrink": {
"number_of_shards": 1
},
"forcemerge": {
"max_num_segments": 1
}
}
},
"cold": {
"min_age": "30d",
"actions": {
"freeze": {}
}
},
"delete": {
"min_age": "90d",
"actions": {
"delete": {}
}
}
}
}
}
์ด ์ ์ฑ
์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํด์ค:
โข Hot: ์ต์ ๋ฐ์ดํฐ, ํ๋ฐํ๊ฒ ๊ฒ์๋จ
โข Warm: ์กฐ๊ธ ์ค๋๋ ๋ฐ์ดํฐ, ๊ฒ์ ๋น๋ ๋ฎ์
โข Cold: ๊ฑฐ์ ๊ฒ์ ์ ๋๋ ๋ฐ์ดํฐ
โข Delete: ๋ณด๊ด ๊ธฐ๊ฐ ์ง๋ ๋ฐ์ดํฐ ์๋ ์ญ์
๐ ์ค์ ํ์ฉ ์ฌ๋ก
์ด๋ก ์ ์ถฉ๋ถํ ๋ฐฐ์ ์ผ๋, ์ด์ ์ค์ ๋ก ์ด๋ป๊ฒ ํ์ฉ๋๋์ง ๊ตฌ์ฒด์ ์ธ ์ฌ๋ก๋ฅผ ์ดํด๋ณด์! ๐ผ
๐ ์ ์์๊ฑฐ๋ ์ํ ๊ฒ์
์จ๋ผ์ธ ์ผํ๋ชฐ์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ ๋ญ๊น? ๋ฐ๋ก ์ํ ๊ฒ์์ด์ผ! ์ฌ์ฉ์๊ฐ ์ํ๋ ์ํ์ ๋น ๋ฅด๊ณ ์ ํํ๊ฒ ์ฐพ์ ์ ์์ด์ผ ํด.
PUT /products
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 2,
"analysis": {
"analyzer": {
"product_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase", "synonym", "stop"]
}
},
"filter": {
"synonym": {
"type": "synonym",
"synonyms": [
"๋
ธํธ๋ถ, ๋ฉํ, laptop",
"์ค๋งํธํฐ, ํด๋ํฐ, ํธ๋ํฐ",
"ํฐ์
์ธ , ๋ฐํ, ํฐ"
]
}
}
}
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "product_analyzer",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"description": {
"type": "text",
"analyzer": "product_analyzer"
},
"category": {
"type": "keyword"
},
"brand": {
"type": "keyword"
},
"price": {
"type": "integer"
},
"rating": {
"type": "float"
},
"stock": {
"type": "integer"
},
"tags": {
"type": "keyword"
},
"created_at": {
"type": "date"
}
}
}
}
GET /products/_search
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "๋ฌด์ ์ด์ดํฐ",
"fields": ["name^3", "description"],
"type": "best_fields"
}
}
],
"filter": [
{
"range": {
"price": {
"gte": 50000,
"lte": 200000
}
}
},
{
"range": {
"rating": {
"gte": 4.0
}
}
},
{
"term": {
"stock": {
"value": 0,
"boost": 0
}
}
}
],
"should": [
{
"term": {
"brand": "์ผ์ฑ"
}
}
]
}
},
"sort": [
{
"_score": "desc"
},
{
"rating": "desc"
}
],
"aggs": {
"price_ranges": {
"range": {
"field": "price",
"ranges": [
{"to": 50000},
{"from": 50000, "to": 100000},
{"from": 100000, "to": 200000},
{"from": 200000}
]
}
},
"brands": {
"terms": {
"field": "brand",
"size": 10
}
}
}
}
์ด ์ฟผ๋ฆฌ๋ ์ํ๋ช ๊ณผ ์ค๋ช ์์ "๋ฌด์ ์ด์ดํฐ"์ ๊ฒ์ํ๊ณ , ๊ฐ๊ฒฉ ๋ฒ์์ ํ์ ์ผ๋ก ํํฐ๋งํ๋ฉฐ, ์ฌ๊ณ ๊ฐ ์๋ ์ํ๋ง ๋ณด์ฌ์ค. ๋์์ ๊ฐ๊ฒฉ๋๋ณ ์ํ ์์ ๋ธ๋๋๋ณ ํต๊ณ๋ ์ ๊ณตํด! ๐ฏ
๐ฐ ๋ด์ค ๊ธฐ์ฌ ๊ฒ์ ์์คํ
๋ด์ค ์ฌ์ดํธ์์๋ ์ต์ ๊ธฐ์ฌ๋ฅผ ๋น ๋ฅด๊ฒ ๊ฒ์ํ๊ณ , ๊ด๋ จ ๊ธฐ์ฌ๋ฅผ ์ถ์ฒํ๋ ๊ธฐ๋ฅ์ด ์ค์ํด.
GET /news/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"content": {
"query": "์ธ๊ณต์ง๋ฅ ๊ธฐ์ ๋ฐ์ ",
"operator": "and"
}
}
}
],
"filter": [
{
"range": {
"published_date": {
"gte": "now-7d/d"
}
}
}
]
}
},
"highlight": {
"fields": {
"content": {
"pre_tags": ["<strong>"],
"post_tags": ["</strong>"],
"fragment_size": 150,
"number_of_fragments": 3
}
}
},
"suggest": {
"text": "์ธ๊ณต์ง๋ฅ",
"simple_phrase": {
"phrase": {
"field": "content",
"size": 3,
"gram_size": 2,
"direct_generator": [
{
"field": "content",
"suggest_mode": "always"
}
]
}
}
}
}
highlight ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๊ฒ์์ด๊ฐ ํฌํจ๋ ๋ถ๋ถ์ ๊ฐ์กฐํด์ ๋ณด์ฌ์ค ์ ์์ด. ์ฌ์ฉ์๊ฐ ์ด๋ค ๋ด์ฉ ๋๋ฌธ์ ๊ฒ์ ๊ฒฐ๊ณผ์ ๋์๋์ง ๋ฐ๋ก ์ ์ ์์ง! โจ
๐ ๋ก๊ทธ ๋ถ์ ์์คํ
์๋ฒ ๋ก๊ทธ๋ฅผ ์ค์๊ฐ์ผ๋ก ์์งํ๊ณ ๋ถ์ํ๋ ๊ฑด ์ด์์ ํ์์ ์ด์ผ. Elasticsearch๋ ELK ์คํ(Elasticsearch, Logstash, Kibana)์ ํต์ฌ์ด์ง!
PUT /_index_template/logs_template
{
"index_patterns": ["logs-*"],
"template": {
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"index.lifecycle.name": "logs_policy"
},
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
},
"level": {
"type": "keyword"
},
"message": {
"type": "text"
},
"service": {
"type": "keyword"
},
"host": {
"type": "keyword"
},
"response_time": {
"type": "integer"
},
"status_code": {
"type": "integer"
},
"user_agent": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}
GET /logs-*/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"level": "ERROR"
}
},
{
"range": {
"@timestamp": {
"gte": "now-1h"
}
}
}
]
}
},
"aggs": {
"errors_by_service": {
"terms": {
"field": "service",
"size": 10
},
"aggs": {
"error_rate": {
"date_histogram": {
"field": "@timestamp",
"fixed_interval": "5m"
}
}
}
},
"slow_requests": {
"filter": {
"range": {
"response_time": {
"gte": 1000
}
}
},
"aggs": {
"avg_response_time": {
"avg": {
"field": "response_time"
}
}
}
}
}
}
์ด ์ฟผ๋ฆฌ๋ ์ต๊ทผ 1์๊ฐ ๋์์ ์๋ฌ ๋ก๊ทธ๋ฅผ ๋ถ์ํด์ ์๋น์ค๋ณ ์๋ฌ ๋ฐ์ ์ถ์ด์ ๋๋ฆฐ ์์ฒญ์ ํ๊ท ์๋ต ์๊ฐ์ ๋ณด์ฌ์ค. ๋ฌธ์ ๋ฅผ ๋น ๋ฅด๊ฒ ํ์ ํ ์ ์์ด! ๐
๐ผ ์ฌ๋ฅ๋ท์์ ์ค์ ๊ฒฝํ ์๊ธฐ
์ด๋ก ์ ๋ฐฐ์ ๋ค๋ฉด ์ด์ ์ค์ ์ด์ผ! ์ฌ๋ฅ๋ท(https://www.jaenung.net)์์๋ ์ค์ ํ๋ก์ ํธ ๊ฒฝํ์ด ์๋ ์ ๋ฌธ๊ฐ๋ค๊ณผ ํจ๊ป Elasticsearch๋ฅผ ํ์ฉํ ์ค๋ฌด ํ๋ก์ ํธ๋ฅผ ์งํํ ์ ์์ด. ํฌํธํด๋ฆฌ์ค๋ ๋ง๋ค๊ณ ์ค๋ ฅ๋ ํค์ธ ์ ์๋ ์ข์ ๊ธฐํ์ง! ๐
๐ ๋ ๋์๊ฐ๊ธฐ
์ฌ๊ธฐ๊น์ง ์๋ค๋ฉด Elasticsearch์ ๊ธฐ๋ณธ์ ๋ง์คํฐํ ๊ฑฐ์ผ! ํ์ง๋ง ๋ฐฐ์ธ ๊ฒ ๋ ๋ง์. ๋ ๊น์ด ์๋ ์ฃผ์ ๋ค์ ์๊ฐํด์ค๊ฒ. ๐
๐ง ๋จธ์ ๋ฌ๋ ๊ธฐ๋ฅ
Elasticsearch๋ X-Pack์ ํตํด ๋จธ์ ๋ฌ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํด. ์ด์ ํ์ง(Anomaly Detection), ์์ธก(Forecasting) ๋ฑ์ ์๋์ผ๋ก ์ํํ ์ ์์ด:
๐ค ML ํ์ฉ ์ฌ๋ก
โข ๋น์ ์์ ์ธ ํธ๋ํฝ ํจํด ๊ฐ์ง
โข ์๋ฒ ๋ฆฌ์์ค ์ฌ์ฉ๋ ์์ธก
โข ์ฌ์ฉ์ ํ๋ ํจํด ๋ถ์
โข ๋ณด์ ์ํ ํ์ง
โข ๋น์ฆ๋์ค ์งํ ์ด์ ๊ฐ์ง
๐ Cross-Cluster Search
์ฌ๋ฌ Elasticsearch ํด๋ฌ์คํฐ๋ฅผ ์ฐ๊ฒฐํด์ ๋์์ ๊ฒ์ํ ์ ์์ด. ์ง์ญ๋ณ๋ก ๋ถ์ฐ๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๊ฒ์ํ๊ณ ์ถ์ ๋ ์ ์ฉํด!
๐ Kibana ํ์ฉ
Kibana๋ Elasticsearch์ ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ผ. ๋์๋ณด๋๋ฅผ ๋ง๋ค์ด์ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ํฐ๋งํ ์ ์์ด:
Kibana ์ฃผ์ ๊ธฐ๋ฅ
โข Discover: ๋ฐ์ดํฐ ํ์ ๋ฐ ๊ฒ์
โข Visualize: ์ฐจํธ, ๊ทธ๋ํ ๋ฑ ์๊ฐํ ์์ฑ
โข Dashboard: ์ฌ๋ฌ ์๊ฐํ๋ฅผ ์กฐํฉํ ๋์๋ณด๋
โข Canvas: ํ๋ ์ ํ
์ด์
์ฉ ์ธํฌ๊ทธ๋ํฝ
โข Maps: ์ง๋ฆฌ ๋ฐ์ดํฐ ์๊ฐํ
โข Machine Learning: ML ์์
๊ด๋ฆฌ
๐ Logstash์ Beats
๋ฐ์ดํฐ๋ฅผ Elasticsearch๋ก ์์งํ๋ ๋๊ตฌ๋ค์ด์ผ:
๐ฅ ๋ฐ์ดํฐ ์์ง ๋๊ตฌ
Logstash: ๋ค์ํ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ์์ง, ๋ณํ, ์ ์กํ๋ ํ์ดํ๋ผ์ธ
Filebeat: ๋ก๊ทธ ํ์ผ ์์ง
Metricbeat: ์์คํ
๋ฐ ์๋น์ค ๋ฉํธ๋ฆญ ์์ง
Packetbeat: ๋คํธ์ํฌ ํจํท ๋ถ์
Heartbeat: ์๋น์ค ๊ฐ์ฉ์ฑ ๋ชจ๋ํฐ๋ง
Auditbeat: ๋ณด์ ๊ฐ์ฌ ๋ฐ์ดํฐ ์์ง
๐ Elasticsearch Service (Cloud)
์ง์ ์ธํ๋ผ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ๋ถ๋ด์ค๋ฝ๋ค๋ฉด Elastic Cloud๋ฅผ ์ฌ์ฉํ ์ ์์ด. AWS, GCP, Azure์์ ๊ด๋ฆฌํ ์๋น์ค๋ก ์ ๊ณต๋ผ:
ํด๋ผ์ฐ๋ ์๋น์ค์ ์ฅ์
โ ์๋ ๋ฐฑ์
๋ฐ ๋ณต๊ตฌ
โ ์๋ ์
๊ทธ๋ ์ด๋
โ ๋ณด์ ํจ์น ์๋ ์ ์ฉ
โ ์ค์ผ์ผ๋ง ๊ฐํธ
โ 24/7 ๋ชจ๋ํฐ๋ง
โ ์ ๋ฌธ๊ฐ ์ง์
๐ก ์ค๋ฌด ํ๊ณผ ๋ฒ ์คํธ ํ๋ํฐ์ค
๋ง์ง๋ง์ผ๋ก ์ค๋ฌด์์ ์ ๋ง ์ ์ฉํ ํ๋ค์ ๊ณต์ ํ ๊ฒ! ์ด๊ฑด ๊ฒฝํ์์ ๋์จ ๋ ธํ์ฐ๋ค์ด์ผ. ๐ฏ
1. ์ธ๋ฑ์ค ๋ค์ด๋ฐ ๊ท์น
์ธ๋ฑ์ค ์ด๋ฆ์ ์ผ๊ด์ฑ ์๊ฒ ์ง์ด์ผ ํด. ์ถ์ฒํ๋ ํจํด์:
{์๋น์ค๋ช
}-{๋ฐ์ดํฐํ์
}-{๋ ์ง}
์: myapp-logs-2024.01.15, myapp-products-v1
์ด๋ ๊ฒ ํ๋ฉด ๊ด๋ฆฌ๊ฐ ํจ์ฌ ์ฌ์์ ธ!
2. ๋งคํ์ ์ ์คํ๊ฒ
ํ ๋ฒ ์์ฑ๋ ํ๋์ ํ์ ์ ๋ณ๊ฒฝํ ์ ์์ด. ์ฒ์๋ถํฐ ์ ์คํ๊ฒ ์ค๊ณํด์ผ ํด. ๋ณ๊ฒฝ์ด ํ์ํ๋ฉด Reindex API๋ฅผ ์ฌ์ฉํด์ผ ํ๋๋ฐ, ์๊ฐ์ด ์ค๋ ๊ฑธ๋ ค!
3. ์ ์ ํ ์ค๋ ํฌ๊ธฐ ์ ์ง
์ค๋๊ฐ ๋๋ฌด ํฌ๋ฉด ๋ณต๊ตฌ ์๊ฐ์ด ๊ธธ์ด์ง๊ณ , ๋๋ฌด ์์ผ๋ฉด ์ค๋ฒํค๋๊ฐ ๋ฐ์ํด. 20GB~50GB ์ฌ์ด๋ฅผ ์ ์งํ๋ ๊ฒ ์ข์. ์๊ณ์ด ๋ฐ์ดํฐ๋ ๋ ์ง๋ณ๋ก ์ธ๋ฑ์ค๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ ํจ๊ณผ์ ์ด์ผ!
4. ๋ณต์ ๋ณธ ํ์ฉ
๋ณต์ ๋ณธ(Replica)์ ๋จ์ํ ๋ฐฑ์ ์ด ์๋์ผ. ๊ฒ์ ์ฑ๋ฅ๋ ํฅ์์์ผ์ค. ๊ฒ์ ์์ฒญ์ด ๋ง๋ค๋ฉด ๋ณต์ ๋ณธ ๊ฐ์๋ฅผ ๋๋ฆฌ๋ ๊ฒ๋ ์ข์ ์ ๋ต์ด์ผ!
5. ์ ๊ธฐ์ ์ธ ๋ฐฑ์
Snapshot API๋ฅผ ์ฌ์ฉํด์ ์ ๊ธฐ์ ์ผ๋ก ๋ฐฑ์ ํด์ผ ํด. ์ฌ๋ ๋ณต๊ตฌ ๊ณํ์ ํ์์ผ!
PUT /_snapshot/my_backup
{
"type": "fs",
"settings": {
"location": "/mount/backups/my_backup"
}
}
POST /_snapshot/my_backup/snapshot_1?wait_for_completion=true
6. ๋ฌธ์ ID ์ ๋ต
์๋ ์์ฑ ID๋ ํธํ์ง๋ง, ์๋ฏธ ์๋ ID๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ณต ์ฒดํฌ๋ ์ ๋ฐ์ดํธ๊ฐ ์ฌ์์ ธ. ์ํฉ์ ๋ง๊ฒ ์ ํํด!
7. ์บ์ฑ ํ์ฉ
์์ฃผ ์ฌ์ฉ๋๋ ์ฟผ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ ๋ฒจ์์ ์บ์ฑํ๋ ๊ฒ ์ข์. Redis๋ Memcached๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋ผ!
8. ๋ชจ๋ํฐ๋ง ์๋ํ
Elasticsearch์ ์ํ๋ฅผ ์๋์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ , ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์๋ฆผ์ ๋ฐ๋๋ก ์ค์ ํด. Kibana์ Watcher๋ ์ธ๋ถ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ํ์ฉํด!
โ ๏ธ ํํ ์ค์๋ค
โ ํ๋ก๋์
์์ wildcard ์ฟผ๋ฆฌ ๋จ์ฉ
โ ๋๋ฌด ๋ง์ ํ๋ ์ ์ (1000๊ฐ ์ด์)
โ ๊น์ ํ์ด์ง๋ค์ด์
(from + size > 10000)
โ ๋ณด์ ์ค์ ์์ด ์ด์
โ ๋ฐฑ์
์์ด ์ด์
โ ๋ก๊ทธ ๋ ๋ฒจ์ DEBUG๋ก ์ด์
๐ฌ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์! ์ฌ๊ธฐ๊น์ง ์ ๋ง ๊ธด ์ฌ์ ์ด์์ด! ๐ Elasticsearch์ ๊ธฐ๋ณธ ๊ฐ๋
๋ถํฐ ์ค์ ํ์ฉ๊น์ง ํจ๊ป ์ดํด๋ดค์ด. ์ฒ์์๋ ๋ณต์กํด ๋ณด์์ ์๋ ์์ง๋ง, ํ๋์ฉ ๋ฐ๋ผํ๋ค ๋ณด๋ฉด ์๊ฐ๋ณด๋ค ์ด๋ ต์ง ์๋ค๋ ๊ฑธ ์๊ฒ ๋ ๊ฑฐ์ผ.
Elasticsearch๋ ์ ๋ง ๊ฐ๋ ฅํ ๋๊ตฌ์ผ. ๊ฒ์ ๊ธฐ๋ฅ๋ฟ๋ง ์๋๋ผ ๋ก๊ทธ ๋ถ์, ์ค์๊ฐ ๋ชจ๋ํฐ๋ง, ๋น์ฆ๋์ค ์ธํ
๋ฆฌ์ ์ค ๋ฑ ๋ค์ํ ๋ถ์ผ์์ ํ์ฉํ ์ ์์ด. ํนํ ๋น
๋ฐ์ดํฐ ์๋์ ํ์์ ์ธ ๊ธฐ์ ์ด์ง! ๐
๊ธฐ์ตํด์ผ ํ ํต์ฌ ํฌ์ธํธ๋ค์ ์ ๋ฆฌํด๋ณผ๊ฒ:
๐ฏ ํต์ฌ ์์ฝ
1. ๊ตฌ์กฐ ์ดํด: Cluster โ Node โ Index โ Document โ Shard
2. ๊ฒ์ ๋ง์คํฐ: Match, Bool, Term, Range ์ฟผ๋ฆฌ ํ์ฉ
3. ์ฑ๋ฅ ์ต์ ํ: ์ ์ ํ ์ค๋ ํฌ๊ธฐ, Filter Context, ์บ์ฑ
4. ํ๊ธ ๊ฒ์: Nori ๋ถ์๊ธฐ๋ก ํํ์ ๋ถ์
5. ๋ณด์: ์ธ์ฆ, ๊ถํ ๊ด๋ฆฌ, ๋คํธ์ํฌ ๋ณด์
6. ๋ชจ๋ํฐ๋ง: ํด๋ฌ์คํฐ ์ํ, ์ฑ๋ฅ ์งํ ์ง์ ํ์ธ
7. ์ค์ ํ์ฉ: ์ ์์๊ฑฐ๋, ๋ก๊ทธ ๋ถ์, ๋ด์ค ๊ฒ์ ๋ฑ
8. ๋ฒ ์คํธ ํ๋ํฐ์ค: ๋ค์ด๋ฐ ๊ท์น, ๋ฐฑ์
, ์ ์ ํ ์ค๊ณ
Elasticsearch๋ ๊ณ์ ๋ฐ์ ํ๊ณ ์์ด. ์๋ก์ด ๊ธฐ๋ฅ๋ค์ด ๊ณ์ ์ถ๊ฐ๋๊ณ , ์ฑ๋ฅ๋ ๊ฐ์ ๋๊ณ ์์ง. ๊ณต์ ๋ฌธ์๋ฅผ ์์ฃผ ํ์ธํ๊ณ , ์ปค๋ฎค๋ํฐ์ ์ฐธ์ฌํ๋ฉด์ ์ต์ ํธ๋ ๋๋ฅผ ๋ฐ๋ผ๊ฐ๋ ๊ฒ ์ค์ํด! ๐
์ฒ์์๋ ์์ ํ๋ก์ ํธ๋ถํฐ ์์ํด๋ด. ๊ฐ๋จํ ๋ธ๋ก๊ทธ ๊ฒ์์ด๋ ์ํ ๊ฒ์ ๊ธฐ๋ฅ์ ๋ง๋ค์ด๋ณด๋ฉด์ ๊ฐ์ ์ตํ๋ ๊ฑฐ์ผ. ๊ทธ๋ฌ๋ค ๋ณด๋ฉด ์ ์ ๋ณต์กํ ์์คํ
๋ ๊ตฌ์ถํ ์ ์๊ฒ ๋ ๊ฑฐ์ผ! ๐ช
ํน์ ๋งํ๋ ๋ถ๋ถ์ด ์๊ฑฐ๋ ๋ ๊น์ด ์๋ ํ์ต์ด ํ์ํ๋ค๋ฉด, ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์ ์ ๋ฌธ๊ฐ์ ๋์์ ๋ฐ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์ผ. ํผ์ ๊ณ ๋ฏผํ๋ ๊ฒ๋ณด๋ค ๊ฒฝํ ๋ง์ ์ฌ๋์ ์กฐ์ธ์ ๋ฃ๋ ๊ฒ ํจ์ฌ ๋น ๋ฅด๊ฒ ์ฑ์ฅํ ์ ์๊ฑฐ๋ ! ๐
์, ์ด์ ๋น์ ์ฐจ๋ก์ผ! Elasticsearch๋ฅผ ์ค์นํ๊ณ , ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ , ๊ฒ์ํด๋ณด๋ฉด์ ์ง์ ๊ฒฝํํด๋ด. ์ด๋ก ๋ง์ผ๋ก๋ ๋ถ์กฑํด. ์ค์ ๋ก ์์ผ๋ก ์ฝ๋ฉํ๊ณ , ์๋ฌ๋ฅผ ๋ง๋๊ณ , ํด๊ฒฐํ๋ฉด์ ์ง์ง ์ค๋ ฅ์ด ๋์ด๋๋ ๊ฑฐ์ผ! ๐ฅ
๊ฒ์ ์์ง ๊ตฌ์ถ์ ์ธ๊ณ๋ ์ ๋ง ํฅ๋ฏธ์ง์งํด. ์ฌ์ฉ์๋ค์ด ์ํ๋ ์ ๋ณด๋ฅผ ๋น ๋ฅด๊ณ ์ ํํ๊ฒ ์ฐพ์์ฃผ๋ ์์คํ
์ ๋ง๋๋ ๊ฑด ์ ๋ง ๋ณด๋์ฐฌ ์ผ์ด์ผ. ๋น์ ๋ ๋ฉ์ง ๊ฒ์ ์์คํ
์ ๋ง๋ค ์ ์์ ๊ฑฐ์ผ! ํ์ดํ
! ๐ซ
๐ ์ถ๊ฐ ํ์ต ์๋ฃ
โข Elastic ๊ณต์ ๋ฌธ์: https://www.elastic.co/guide
โข Elasticsearch ๊ณต์ ๋ธ๋ก๊ทธ: https://www.elastic.co/blog
โข Elastic Community: https://discuss.elastic.co
โข GitHub Elasticsearch: https://github.com/elastic/elasticsearch
โข Elastic ์ ํ๋ธ ์ฑ๋: ๋ค์ํ ํํ ๋ฆฌ์ผ๊ณผ ์จ๋น๋
๐ ์ฌ๊ธฐ๊น์ง ์ฝ์ด์ค์ ์ ๋ง ๊ณ ๋ง์! ๐
๋น์ ์ Elasticsearch ์ฌ์ ์ ํ์ด์ ๋น์ด! ๐
๊ด๋ จ ํค์๋
๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.