[elastic search] ์๋ผ์คํฑ ์์น๋(elastic search, kibana ์ฌ์ฉ๋ฒ)
์ด๋ฒ ๊ฒ์๊ธ์์๋ elastic search์ ๋ํด ์ ๋ฆฌํฉ๋๋ค.
1. elastic search๋
๊ฒ์์์ง์ด์ ๋ถ์ฐ์ ์ฅ์์
๋๋ค.
์ผ๋ฐ์ ์ผ๋ก JSON ํ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฉฐ ๋ฃจ์ฌ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ๋์ด์์ด ๋น ๋ฅธ ๊ฒ์์ด ๊ฐ๋ฅํฉ๋๋ค.
์๋น์ค์ ๊ฒ์์ ์ํด ์ฌ์ฉ๋๊ฑฐ๋, ๋ก๊ทธ ๋ฑ์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ ๋ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.(ELF, EFK ๋ฑ)
elastic search์ ํจ๊ป ๋ธ๋ ค์ค๋ kibana๋ elastic search๋ฅผ ์ฐ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด์ฃผ๋ ํด์ด๋ฉฐ
๊ฒฐ๊ณผ๋ฅผ ์๊ฐํํ๋ ๊ธฐ๋ฅ๊ณผ dsl์ ์ง์ํ ํด์ ์ ๊ณตํ๋ ๋ฑ ์ถ๊ฐ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
2. ์ธ์ ์ฌ์ฉํ๋ฉด ์ข์๊น
๋ด๋ถ์ ์ผ๋ก ๋ณต์กํ ๊ณผ์ (Caharacter filter, Tokenizer, Token filter๋ฅผ ์ด์ฉํ ๊ตฌ๋ฌธ ๋ถ์ ๋ฐ Inverted index table ๊ตฌ์ถ)์ ๊ฑฐ์ณ elastic search์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ค์ ๊ฒ์์ ํนํ๋์ด ์์ผ๋ฏ๋ก ํน์ ํ๊ธฐ ํ๋ ๋ด์ฉ์ผ๋ก ๊ฒ์์ ํด์ผ๋๋ ์ํฉ์ ์ฌ์ฉํ๊ธฐ ์ ํฉํฉ๋๋ค.
ํน์ ๋์ง ์์ ๋ฐ์ดํฐ๋ก๋ O(1)์ ์คํ๋ ๊ฒ์์ฑ๋ฅ์ ๋ณด์ฌ์ค๋๋ค.
3. elastic search ์ ์ฉ์ด ์ ์
rdb์ ๋น๊ตํ์๋ elastic search๋ ์๋์ ๊ฐ์ ์ํคํ
์ณ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
index, field, document๊ฐ ํต์ฌ ์ฉ์ด์
๋๋ค.
elastic search๋ json ๋ฌธ์๋ฅผ ์ ์ฅํ๊ฒ ๋๋๋ฐ ์ด๋์ ์ ์ฅํ ์ง index๋ฅผ ์ค์ ํด์ ์ ์ฅํ๊ฒ ๋ฉ๋๋ค.
์ ์ฅํ๋ json์ key๋ field๋ผ๊ณ ํ๋ฉฐ json ๋ฌธ์์์ฒด๋ document๋ผ๊ณ ์นญํฉ๋๋ค. type์ index ๋ด๋ถ์์ ํ
์ด๋ธ์ ์ชผ๊ฐ๋ ๊ฐ๋
์
๋๋ค.
4. elastic search ์ฌ์ฉ๋ฒ
elastic search๋ ๊ฒ์์์ง์ผ๋ก ์๋ ค์ ธ์์ง๋ง ๊ทผ๋ณธ์ ์ผ๋ก๋ ์ ์ฅ์์ด๋ฏ๋ก ์ต์ํด์ง๋๋ฐ๋ crud๋ฅผ ํด๋ณด๋๊ฒ ๊ฐ์ฅ ์ข์ต๋๋ค.
http request๋ฅผ ์ฌ์ฉํ์ฌ dsl์ ์ฌ์ฉํ๊ฑฐ๋, kibana๋ฅผ ํตํด dsl์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
(1). create
elastic search๋ schemaless๋ผ๋ ํน์ฑ๋๋ถ์ ๋ฐ๋ก database๋ฅผ ๋ง๋ค์ด์ฃผ์ง ์๋๋ผ๋ ๋ฐ์ดํฐ ์ ์ฅ(์ธ๋ฑ์ฑ)์ด ๊ฐ๋ฅํฉ๋๋ค.
my_index(database)์ ์๋์ ๊ฐ์ jsonํ์ผ์ ์ ์ฅํฉ๋๋ค.
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ฒ๋๋ฉด ์ค๋๋ผ๋ ๊ณณ์ ๊ธฐ๋ก๋์ด ๋์คํฌ์ ์ ์ฅ๋ฉ๋๋ค.
// index๋ my_index, type์ _doc์ด๋ผ๋ ์คํค๋ง์ ์ ์ฅํ๊ฒ ๋ฉ๋๋ค.
// es๋ ์คํค๋ง๋ฆฌ์ค์ด๋ฏ๋ก ๋ฐ๋ก ์์ฑํ์ง ์์๋ ๋ฉ๋๋ค(type์ ๋ฏธ๋ฆฌ ์ ํด์ง ๊ท์น์ ๋ง์์ผ ํฉ๋๋ค)
// 1๋ฒ ๋ฌธ์id์ ํด๋น json์ ์ ์ฅํฉ๋๋ค.
PUT my_index/_doc/1
{
"name": "Tom",
"age": "20"
}
// ๋ฌธ์๋ฒํธ๋ฅผ ์ง์ ํ๊ณ ์ถ์ง ์๋ค๋ฉด POST๋ฅผ ์ฌ์ฉํฉ๋๋ค.
POST my_index/_doc
{
"name": "John",
"age": "21"
}
(2) read
๊ฐ๋จํ ์กฐํ๊ธฐ๋ฅ์ ์๋์ DSL์ ์ด์ฉํฉ๋๋ค.
// my_index์ ๋ด์ฉ ์ ์ฒด ์กฐํ
GET my_index/_search
// 1๋ฒ id ์กฐํ
GET my_index/_doc/1
_search์๋์ queryํ๋๋ฅผ ์์ฑํ๊ณ match_all, match, bool, must๋ฑ์ ํฌํจํ dsl์ ์์ฑํ๋ฉด ์ํ๋ ๋ฌธ์๋ฅผ ๊ฐ์ ธ์ฌ์ ์์ต๋๋ค.
๋ฃจ์ฌ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ๋์๊ธฐ์ ๊ฒ์์๋๊ฐ ๋น ๋ฆ
๋๋ค.
์์ธํ ์ฌ์ฉ๋ฒ์ ๊ณต์๋ฌธ์๋ฅผ ์ฐธ๊ณ ํฉ๋๋ค.(kibana๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋๊ฒฝ์ฐ ๊ฒ์ ์ฟผ๋ฆฌ๋ฅผ ๋ชฐ๋ผ๋ ํด๋ฆญ๋ช๋ฒ์ผ๋ก ๊ฒ์์ฟผ๋ฆฌ๋ฅผ ์งค์์์ผ๋ฏ๋ก kibana๋ฅผ ์ฃผ๋ ฅ์ผ๋ก ์ฌ์ฉํ๋๊ฒฝ์ฐ ๊ฐ๋ณ๊ฒ ์ฝ์ด๋ด
๋๋ค)
(3) delete
// 1๋ฒ ๋ฌธ์ ์ญ์
DELETE my_index/_doc/1
// my_index ์ ์ฒด ์ญ์
DELETE my_index
5. kibana ์ฌ์ฉ๋ฒ
(1). index pattern ์์ฑ
kibana์ ๋ค์ด๊ฐ ์ฌ์ด๋๋ฐ์ Management๋ฅผ ํด๋ฆญํด ์ธ๋ฑ์ค ํจํด์ ์์ฑํ ์ ์์ต๋๋ค.
my_* ์ผ๋ก ์ธ๋ฑ์ค ํจํด์ ์ง์ ํ๊ฒ ๋๋ฉด my_๋ก ์์๋๋ ๋ชจ๋ document๋ฅผ ๋ฌถ์์ ์์ต๋๋ค
๋ ์๋ณ๋ก index๊ฐ ๋ณ๊ฒฝ๋๋ค๋ฉด(my_index-2022-08-29 ๋ฑ) ์์คํฐ๋ฆฌ์คํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํธํ๊ฒ ์๊ฐํ ํ ์ ์์ต๋๋ค.
์ ์ฅ๋ document์ iso 8601๋ก ์ค์ ๋ ์๊ฐํ๋๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๋ค๋ฉด ๋ก๊ทธ๊ฐ ์ธ์ ์ผ๋ง๋ ๋ค์ด์๋์ง ๊ทธ๋ํํ ํ ์ ์์ต๋๋ค.
(2). ๊ฒฐ๊ณผ ํ์ธ
์ฌ์ด๋๋ฐ์์ Discover ํญ์ ๋๋ฅด๋ฉด ์ฌ์ง๊ณผ ๊ฐ์ ํ๋ฉด์ผ๋ก ์ด๋๋๋ฉฐ
์์ฑ๋ index pattern์ด ์ผ์ชฝ ์๋จ ์ฝค๋ณด๋ฐ์ค์ ํ์๋ฉ๋๋ค. ํด๋น๋ฒํผ์ ํด๋ฆญํด ๋ก๊ทธ๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
(GET my_index/_search ์ ๊ฒฐ๊ณผ๋ฅผ ์๊ฐํ)
Add a filter ๋ฒํผ์ ๋๋ฅด๊ฑฐ๋ + ๋๋ณด๊ธฐ ๋ฒํผ์ ๋๋ฌ ์ถ๊ฐ์ ์ธ ์ฟผ๋ฆฌ(filter)๋ฅผ ์ฝ๊ฒ ์ ์ฉ์ํฌ์ ์์ต๋๋ค.