์•Œ์“ธ์‹ ์žกโœจ

[elastic search] ์—˜๋ผ์Šคํ‹ฑ ์„œ์น˜๋ž€(elastic search, kibana ์‚ฌ์šฉ๋ฒ•)

ํ”„๋ฆฌ๋ฆด๋ฆฌ๐Ÿ›ซ 2024. 11. 18. 12:00

์ด๋ฒˆ ๊ฒŒ์‹œ๊ธ€์—์„œ๋Š” 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๋ฅผ ์ฃผ๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฒฝ์šฐ ๊ฐ€๋ณ๊ฒŒ ์ฝ์–ด๋ด…๋‹ˆ๋‹ค)

 

5.1 ํ’€ ํ…์ŠคํŠธ ์ฟผ๋ฆฌ - Full Text Query - Elastic ๊ฐ€์ด๋“œ๋ถ

๊ฒ€์ƒ‰์–ด๊ฐ€ ์—ฌ๋Ÿฟ์ผ ๋•Œ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์„ OR ๊ฐ€ ์•„๋‹Œ AND ๋กœ ๋ฐ”๊พธ๋ ค๋ฉด operator ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ฌธ๋ฒ•์ด ์กฐ๊ธˆ ๋‹ฌ๋ผ์ง€๋Š”๋ฐ, <ํ•„๋“œ๋ช…>:<๊ฒ€์ƒ‰์–ด> ํ˜•์‹์œผ๋กœ ํ•˜๋˜ ๊ฒƒ์„ <ํ•„๋“œ๋ช…>: { "query":<๊ฒ€์ƒ‰์–ด>

esbook.kimjmin.net


(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)๋ฅผ ์‰ฝ๊ฒŒ ์ ์šฉ์‹œํ‚ฌ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

[elastic search] ์—˜๋ผ์Šคํ‹ฑ ์„œ์น˜๋ž€(elastic search, kibana ์‚ฌ์šฉ๋ฒ•)

์ด๋ฒˆ ๊ฒŒ์‹œ๊ธ€์—์„œ๋Š” elastic search์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. 1. elastic search๋ž€ ๊ฒ€์ƒ‰์—”์ง„์ด์ž ๋ถ„์‚ฐ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฉฐ ๋ฃจ์”ฌ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœ๋˜์–ด์žˆ์–ด ๋น ๋ฅธ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ

frozenpond.tistory.com

 

๋ฐ˜์‘ํ˜•