Elasticsearch์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฌํ ๋, ์ด๋ค ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฌํ ์ง์ ๋ํ ์ธํ ์ ํด์ค ์ ์๋ค.
Elasticsearch๋ ์ญ์์ธ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ธ๋ฑ์ฑํ๊ธฐ ๋๋ฌธ์, ์ญ์์ธ์ ๊ธฐ์ค์ด ๋๋ ๋จ์ด(token)๋ค์ ์ด๋ป๊ฒ ํ ํฐํํ๋์ง์ ๋ฐ๋ผ์ ๊ฒ์์ ๊ฒฐ๊ณผ๋ ๋ฌ๋ผ์ง ์ ์๋ค.
์ด๋ ๊ฒ Token์ ์์ฑํ๋ ๊ท์น์ ๋ด์ ์ค์ ์ Index Template๋ผ๊ณ ๋ถ๋ฅธ๋ค.
Elasticsearch์ Index Template์ ํฌ๊ฒ Setting์ ์์ญ๊ณผ Mapping์ ์์ญ์ผ๋ก ๋๋์ด์ง๋ค. ์ค๋์ Setting์ ๊ตฌ์ฑ์์์ธ Analyzer, Tokenizer, Filter์ ๋ํด ์ด์ผ๊ธฐํด๋ณด๋ ค๊ณ ํ๋ค!
- logstash์์ elasticsearch๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด์ค ๋ json ํํ๋ก ๋ฏธ๋ฆฌ setting ํ์ผ์ ๋ง๋ค์ด์ document template๋ฅผ ์ง์ ํ ์๋ ์๋ค.
A. Elasticsearch Analyzer
- analyzer → elasticsearch์์ ํ๋ ์ธ๋ฑ์ฑ / documentํํ ๋ ํ
์คํธ๋ฅผ ๋ถ์ํ๋ ์์ง
- 1๊ฐ์ tokenizer / ๋ค์์ filter
- filter
- CharFilter : ์
๋ ฅ๋ ๋ฌธ์์ด์ ๋ํ ๋ถํ์ํ ๋ฌธ์ normalization
- ๊ณต๋ฐฑ, ์ฝค๋ง ๋ฑ์ ๋ฌธ์ ์ญ์
- TokenFilter : tokenizer๋ก ๋ถํด๋ token์ ๋ํ filter
- CharFilter : ์
๋ ฅ๋ ๋ฌธ์์ด์ ๋ํ ๋ถํ์ํ ๋ฌธ์ normalization
ํ๋ฆ์ ๋ณด๋ฉด, ๋จผ์ Text๊ฐ ๋ค์ด์ค๋ฉด Character Filter๋ฅผ ๊ฑฐ์ณ normalization์ด ๋๊ณ , Tokenizer๋ฅผ ๊ฑฐ์ณ์ ๋ฌธ์ฅ์ ํ ํฐํํ๊ณ ๋ ๋ค ๊ฐ ํ ํฐ์ ๋ํด์ Token Filter๊ฐ ํ์ฒ๋ฆฌํ ๋ค ์์ธ์ ์์ฑํ๋ค.
kibana - dev tools์์ ๋ฏธ๋ฆฌ ์คํํด๋ณผ ์ ์๋ค. ์๋ ํ ํ๋ฆฟ์ ๊ฐ๊ฐ ๋์ ํด๋ณด๋ฉด ๋๊ฒ ๋ค.
get _analyze
{
"text": "{EXAMPLE TEXT}",
"char_filter": ["{CHARACTER FILTER}"],
"tokenizer": {
"type": "{TOKENIZER}"
},
"filter": ["{TOKEN FILTER}"]
}
1. CharFilter
์ ๋ ฅ๋ ๋ฌธ์์ด์ ๋ํ ์ ์ฒ๋ฆฌ ๋จ๊ณ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
- html_strip - html ํ๊ทธ๋ฅผ ์ญ์ ํด์ฃผ๋ filter
"char_filter": {
"my_char_filter": {
"type": "pattern_replace",
"pattern": "(\\d+)-(?=\\d)",
"replacement": "$1_"
}
}
- mapping - ํน์๋ฌธ์, ๋ถ์ฉ์ด ๋ฑ์ ๋ค๋ฅธ ํํ๋ฐฉ์์ผ๋ก 1๋ 1 ๋งคํ์์ผ์ค(์๋)
"char_filter": [
{
"type": "mapping",
"mappings": [
"ู => 0",
"ูก => 1",
"ูข => 2",
"ูฃ => 3",
"ูค => 4",
"ูฅ => 5",
"ูฆ => 6",
"ูง => 7",
"ูจ => 8",
"ูฉ => 9"
]
}
]
- pattern_replace - ํน์ ํ ๋ฌธ์ ํจํด์ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋์ฒดํด์ค(์๋)
- ex) 123-678 ⇒ 123_678
"char_filter": {
"my_char_filter": {
"type": "pattern_replace",
"pattern": "(\\d+)-(?=\\d)",
"replacement": "$1_"
}
}
- ex) CamelCase replacement
"char_filter": {
"my_char_filter": {
"type": "pattern_replace",
"pattern": "(?<=\\\\p{Lower})(?=\\\\p{Upper})",
"replacement": " "
}
}
2. Tokenizer
์ ์ฒ๋ฆฌ๋ฅผ ๋ง์น ๋ฌธ์์ด์ ํ ํฐํํ๋ ๋จ๊ณ์ด๋ค. ์๋ ์ฌ์ง์ "how to tokenize string?" ๋ฌธ์ฅ์ standard tokenizer๋ก ํ ํฐํํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋ค.
Elasticsearch์์ ์ง์ํ๋ ์๋ง์ ํ ํฌ๋์ด์ ๊ฐ ์๋ค. ์ค์ ํ์ง ์์ผ๋ฉด ์ค์ ๋๋ ๊ธฐ๋ณธ tokenizer type์ Standard์ด๋ค.
Word Oriented Tokenizers(๋จ์ด ์งํฅ ํ ํฌ๋์ด์ )
- Standard Tokenizer : ์ ๋์ฝ๋ ํ ์คํธ ๋ถํ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ผ ํ ํฐํ
- Letter Tokenizer : ๋ฌธ์(letter)๊ฐ ์๋ ๊ฒ์ ๋ง๋ ๋๋ง๋ค ๋จ์ด๋ก ํ ํฐํ
- Lowercase Tokenizer : Letter tokenizer์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์ + ์ํ๋ฒณ์ ์ ๋ถ ์๋ฌธ์๋ก
- Whitespace Tokenizer : ๊ณต๋ฐฑ์ ๋ง๋ ๋๋ง๋ค ๋จ์ด๋ก ํ ํฐํ
- UAX URL Email Tokenizer : url๊ณผ email์ ๋จ์ผ ํ ํฐ์ผ๋ก ์ธ์งํ๋ standard tokenizer
Partial Word Tokenizers(๋ถ๋ถ ๋จ์ด ํ ํฌ๋์ด์ )
- N-Gram Tokenizer : ๊ณต๋ฐฑ์ด๋ ๋ฌธ์ฅ๋ถํธ ๋ฑ์ ๋ง๋๋ฉด ํ
์คํธ๋ฅผ ๋จ์ด๋ก ๋ถํด -> ๊ฐ ๋จ์ด์ n-gram ๋ฐํ
- ex) quick => [qu, ui, ic, ck]
- Edge N-Gram Tokenizer : N-Gram๊ณผ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ผ๋ N-Gram์ ์ ์ฉํ ๋ ์ฒซ ๋ฌธ์๋ฅผ ํฌํจํ๋ ๋ถ๋ถ ๋ฌธ์์ด tokenizing
- ex) quick => [q, qu, qui, quic, quick]
Structed Text Tokenizer(๊ตฌ์กฐํ๋ ํ ์คํธ ํ ํฌ๋์ด์ )
- Keyword Tokenizer : ์ฃผ์ด์ง ํ ์คํธ ์ ์ฒด๋ฅผ ํ๋์ ํ ํฐ์ผ๋ก ํ ํฐํ
- Pattern Tokenizer : ์ ๊ท์์ผ๋ก ์ผ์นํ๋ ํจํด์ด ์์ ๋๋ง๋ค ํ ํฐํ
- Path Tokenizer : ํ์ผ ์์คํ
๊ฒฝ๋ก์ ๊ฐ์ ๊ณ์ธต์ ๊ฐ์ / ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถํ ํด์ ์์ ๊ฒฝ๋ก๋ค์ ํ ํฐํ
- ex) /foo/bar/baz→ [/foo, /foo/bar, /foo/bar/baz ]
์ด์ธ์๋ ์ธ์ด๋ณ๋ก tokenizer๋ฅผ ์ถ๊ฐ ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ค์นํด์ ์ฌ์ฉํ ์ ์๋ ๋ฑ ์๋ง์ tokenizer์ด ์กด์ฌํ๋ค. (ํ๊ตญ์ด ํ ํฌ๋์ด์ ์ธ Nori https://www.elastic.co/guide/en/elasticsearch/plugins/8.8/analysis-nori.html ์ฒ๋ผ) ๋ ๋ง์ ๋ด์ฉ์ ๊ณต์ ๋ฌธ์์์!
3. Token Filter
Tokenizer์ ์ ์ฉํ ๋ค ๋ถํ ๋ Token๋ค์ ๋ํ ํ์ฒ๋ฆฌ ์์ ์ด๋ค. ์ ๋ง ์ข ๋ฅ๊ฐ ๋๋ฌด ๋๋ฐ ๋ง๊ธฐ ๋๋ฌธ์ ํ๋ํ๋ ์ค๋ช ํ์ง๋ ์๊ฒ ๋ค.
B. Kibana์์ Template ์ค์ ํ๊ธฐ
Kibana์์ index template๋ฅผ ์์ฑํ ์ ์๋ค. UI๊ฐ ์ ๋์ด์์ผ๋ ๋ฐ๋ผํด๋ณด์.
๊ฒ์์ฐฝ์ index๋ฅผ ๊ฒ์ํ๋ฉด Index Management ํ์ด์ง๊ฐ ์๋ค. ์ฌ๊ธฐ์์ Index Template ํญ์ ์ ํํ๊ณ Create Template๋ฅผ ๋๋ฅธ๋ค.
์ด๋ฆ๊ณผ ์ด ํ ํ๋ฆฟ์ ์ ์ฉํ index pattern์ ์ค์ ํด์ค๋ค. ๋๋ logstash๋ฅผ ํตํด์ ์ index ์ด๋ฆ์ผ๋ก postgres๋ฅผ ๋ง๋ค์ด์ค ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ํจํด์ ์์ ๊ฐ์ด ์ ์ฉ์์ผฐ๋ค.
Component templates๋ฅผ ๋์ด๊ฐ๋ค. ์ฌ์ค ์์ง ์ธ ์ผ์ด ์์๋ค^^... ์ธ ์ผ์ด ์๊ธฐ๋ฉด ์ถํ ์ถ๊ฐ์์
์ด ๋ถ๋ถ์ ์๊น ๊ทธ analyzer๋ฅผ ์ ์ํ๋ค. ์์๋ ์๋์ ๊ฐ๋ค.
์ด๋ ๊ฒ ์ฐ๋ฉด character_filter๋ html_strip, tokenizer๋ whitespace, token filter๋ lowercase๋ฅผ ์ฐ๋ ์ปค์คํ analyzer๋ฅผ ์์ฑํ ๊ฒ์ด๋ค. ์ฐ์ธก ํ๋จ Preview index template๋ฅผ ๋๋ฅด๋ฉด ์๋ฌ๊ฐ ๋๋์ง ๋ฌธ๋ฒ์ด ํ๋ฆฌ์ง๋ ์์๋์ง ๋ฉ์ธ์ง๋ฅผ ๋ณผ ์ ์๋ค.
์์ง ๋๋์ง ์์๋ค... ์ ์ด๋ mapping๊น์ง๋ ํด์ค์ผ ์ ๋๋ก ๋์๊ฐ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. mapping์ ๋ํด์๋ ๋ค์ ํฌ์คํ ์์ ๋ค๋ฃจ๋๋ก ํ๊ฒ ๋ค. ๋!