[Elasticsearch] analyze
match ๋ฑ์ ํ
์คํธ ๊ฒ์๊ธฐ๋ฅ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก analyze๋ผ๋ ์ ์ฒ๋ฆฌ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ๊ฐ๋ค๊ณ ํ์๋ค.
์ฌ๊ธฐ์ ๋ํด์ ์ ๊น ๋ค๋ค๋ณด๊ฒ ๋ค.
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-analyze.html
์ด ์ ๋๋ผ์ด์ฆ๋ ๊ผญ ๊ฒ์์ ํ ๋๋ง ์ธ์ ์๋๊ฑด ์๋๊ณ , ์ ๊ณต๋๋ API๋ฅผ ํตํด์ ๋ฑ ๊ทธ ์ ์ฒ๋ฆฌ ๋จ๊ณ๋ง์ ํ
์คํธํด๋ณผ ์๋ ์๋ค.
ํธ์ถํํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
๊ธฐ๋ณธ ์ ๋๋ผ์ด์ ๋ฅผ ์ฐ๊ณ ํ
์คํธ๋ "์์ํ ์ดํธ"๋ค.
๊ทธ๋ผ ๋ด๋ถ์ ์ผ๋ก ์ฒ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํ๋์ง๋ฅผ ๋ฆฌ์คํฐ์ค๋ก ์ฐ์ด์ค๋ค.
์ฌ๊ธฐ์๋ "์์ํ"๊ณผ "์ดํธ"๋ก ์๋ผ์คฌ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๊ณต๋ฐฑ๋จ์๋ ์ ๋ถ ์๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง "์์ํ์ดํธ"๋ฅผ ์ ๋ ฅํ๋ค๋ฉด, ์ฐ๋ฆฌ๋ "์์ํ"๊ณผ "์ดํธ"์ 2๊ฐ ๋จ์ด๋ก ๋๋จ์ ์์ง๋ง, ์ ๋๋ผ์ด์ ๋ ์์ง ๋ชปํ๋ค. ๊ทธ๋์ "์์ํ ์ดํธ"์ ๋ํ ๊ฒ์์ ์ด๋ฃจ์ด์ง์ง ์๋๋ค.
์ด๋ฐ ๊ฒ ๋๋ฌธ์ ์ ๋๋ผ์ด์ ์ ์ปค์คํ
์ด ํ์ํ ๊ฒ์ด๋ค.
ํ๊ตญ์ด ํํ์๋ถ์๊ธฐ์ธ nori๋ฅผ ์ด๋ค๋ฉด ํ๊ตญ์ด์ ๋ํ ๋ฌธ์ฅ์์๋ณ ๋ถ๋ฆฌ๊ฐ ๊ฐ๋ฅํด์ง๋ค.
์ด๊ฒ๋ ์ ๋๋ก ์ฐ๋ ค๋ฉด ์ค์ ํ ๊ฒ ์์ฒญ ๋ง์๋ฐ, ์ผ๋จ ๊ธฐ๋ณธ์ค์ ์ผ๋ก ๋ ๋ฆฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ถ์๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
"์์"๊ณผ "์ดํธ"๋ก ๋ถ๋ฆฌ๊ฐ ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ๋ explain์ ์ผ๋ฉด ๋ถ์๋ฒ์ ์ข ๋ณผ ์ ์๋ค.

์ ๋๋ผ์ด์ ์ ๊ตฌ์กฐ
์ ๋๋ผ์ด์ ๋ ํฌ๊ฒ 3๋จ๊ณ์ ์ฒ๋ฆฌ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ค.
์บ๋ฆญํฐ ํํฐ, ํ ํฌ๋์ด์ , ํ ํฐ ํํฐ๋ค.
https://esbook.kimjmin.net/06-text-analysis/6.2-text-analysis
1. ์บ๋ฆญํฐ ํํฐ
์บ๋ฆญํฐ ํํฐ๋ ํ ํฌ๋์ด์ ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ๊ฐ๋ฒผ์ด ์ ์ฒ๋ฆฌ๋ฅผ ํํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ด๋ค.
ํ ํฌ๋์ด์ ์ ํ ํฐ ํํฐ์ ๋นํด์๋ ๊ทธ๋ ๊ฒ ์์ฃผ ์ฐ์ด์ง๋ ์๋ ๊ฒ ๊ฐ๋ค.
์บ๋ฆญํฐ ํํฐ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก HTML Strip, Mapping, Pattern Replace์ 3๊ฐ์ง ํํฐ๊ฐ ์ ๊ณต๋๋ค.
"char_filter" ์ต์
์ผ๋ก ์ง์ ๊ฐ๋ฅํ๋ค.
html strip์ ๊ทธ๋ฅ html ํน์๋ฌธ์๋ค์ ์ฝ์ด์ ์นํํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.
์๋๋ผ๋ฉด ์ ๋๋ก ์ฝ์ง ๋ชปํ ๊ฒ์

char_filter๋ก ์ ์ฉํด์ฃผ๋ฉด html ํน์๋ฌธ์ &npsp๋ฅผ ๊ณต๋ฐฑ์ผ๋ก์ ์ธ์ํ๊ฒ ๋๋ค.

๋งคํ ํํฐ๋ ๊ทธ๋ฅ ํน์ ๋จ์ด๋ฅผ ๋ค๋ฅธ ๋จ์ด๋ก ๊ต์ฒดํ ์ ์๊ฒ ํด์ค๋ค.
"๋์ ๋จ์ด => ๋ฐ๊ฟ ๋จ์ด"์ ํํ๋ก ์ง์ ํด์ค ์ ์๋ค.

Pattern Replace๋ ๊ทธ๋ฅ ์ ๊ทํํ์์ผ๋ก ์นํ์ ํด์ฃผ๋๊ฑด๋ฐ, ์ด๊ฑด ๋ณต์กํด์ ์ผ๋จ ๋๊ธฐ๊ฒ ๋ค.
2. ํ ํฌ๋์ด์
์๊น ์์์ ๋ค๋ค๋ nori๋ผ๋ ํํ์ ๋ถ์๊ธฐ๊ฐ ์ฌ์ค ํ ํฌ๋์ด์ ์๋ค.
ํ ํฌ๋์ด์ ๋ ์ ์๋ ๊ท์น์ ๋ฐ๋ผ์ ํ
์คํธ๋ฅผ ํ ํฐ ๋จ์๋ก ์๋ผ์ฃผ๋ ๋
์์ด๋ค.
"tokenizer" ์ต์
์ผ๋ก ์ง์ ๊ฐ๋ฅํ๋ฉฐ, ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ํ ํฌ๋์ด์ ๋ก๋ standard, letter, whiltespace ๋ฑ์ด ์๋ค.
์ด์ธ์๋ ๋ช๊ฐ ์๊ธด ํ๋ฐ ๊ตณ์ด ์ฌ๊ธฐ์ ๋ค ๋ค๋ฃจ์ง๋ ์๊ฒ ๋ค.
standard๋ ๊ทธ๋ฅ ๊ณต๋ฐฑ์ผ๋ก ํ ํฐ์ ์๋ฅด๋ฉด์ @ ๊ฐ์ ์ผ๋ถ ํน์๋ฌธ์๋ง ์ง์์ค๋ค.

๊ทธ๋ฆฌ๊ณ letter๋ ๊ณต๋ฐฑ์ ํฌํจํ ํน์๋ฌธ์๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ํฐ์ ์๋ฅธ๋ค.

whiltespace๋ ๊ทธ๋ฅ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ํ ํฐ์ ์๋ฅด๊ธฐ๋ง ํ๋ค.

nori ๊ฐ์ ์ ๋ฌธํ๋ ํํ์ ํ ํฌ๋์ด์ ๋ ๋ณ๋ ํฌ์คํธ๋ก ๋ค๋ฃจ๊ฒ ๋ค.
3. ํ ํฐ ํํฐ
์ด๊ฑด ํ ํฌ๋์ด์ ๋ก ๋ถ๋ฆฌ๋ ํ ํฐ์, ๋ง์ง๋ง์ผ๋ก ํ๋ฒ ๋ ์นํํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.
"filter" ์ต์
์ผ๋ก ๋ณต์ ์ง์ ๊ฐ๋ฅํ๋ฉฐ, lowercase, uppercase, stop, unique, synonym ๋ฑ์ด ์๋ค.
์ด์ค์์ stopword์ synonym์ด ์๋ง ์ ์ผ ์์ฃผ ์ฐ์ผ ๊ฒ์ด๋ค.
ํ ํฐํํฐ - lowercase, uppercase
lowercase, uppercase๋ ๊ฐ๊ฐ ์ ๋ถ ์๋ฌธ์, ๋๋ฌธ์๋ก ์นํํด์ฃผ๋ ํํฐ๋ค.


stop์ ํน์ ํ ํฐ๋ค์ ๊ฑธ๋ฌ๋ด๋ ์ญํ ์ ํ๋ค. stopword๋ก ์ง์ ๋ ๋จ์ด๋ฅผ ํ ํฐ ๋จ์๋ก ๋์ ธ๋ฒ๋ฆฐ๋ค.
์ด๊ฑด ๊ทธ๋ฅ ๋ฐ๋ก ํ
์คํธ๊ฐ ์๋ผ์, ์ธ๋ฑ์ค์ ํจ๊ป ๋ง๋ค์ด์ ํ
์คํธ๋ฅผ ํ๋ค.

์ด๋ฌ๋ฉด ์ด์ stopword๋ก ์ง์ ๋ ๋จ์ด is๊ฐ ์๋์ผ๋ก ์ฌ๋ผ์ง ๊ฒ์ด๋ค.

ํ ํฐํํฐ - unique
unique๋ ํ ์ค๋ณต๋ ํ ํฐ์ ์๋ผ์ค๋ค.

๊ทธ๋ผ ์ด์ ์ค๋ณต๋จ์ด Happy๊ฐ ํ๋๋ง ์ ๋ฌ๋ ๊ฒ์ด๋ค.

ํ ํฐํํฐ - synonym
synonym์ ๋์์ด๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.
๊ณ ํ์ง์ ๊ฒ์์ ์ํ๋ค๋ฉด ์ ๋นํ ๋ฃ์ด์ฃผ๋๊ฒ ์ข๋ค.
์ด๋ฐ์์ผ๋ก ์ง์ ํ ์ ์๋๋ฐ, ์ฌ๊ธฐ์ ๋์์ด ๋ชฉ๋ก์ synonyms๋ก ๋ฐ์๋จ์ง๋ง ๋ฐ๋ก ํ์ผ ์
๋ก๋ํด์ synonyms_path๋ก ํ์ผ๊ฒฝ๋ก ์ง์ ํด์ฃผ๋๊ฒ ์ ์์ด๋ค.
์ ๋ฌ๋ฉด shampoo, ์ดํธ, ์ดํจ ํ ํฐ์ ๋ง๋๋ฉด ์ ๋ถ "์ดํธ"๋ก ์นํํ๋ค๋ ๋ด์ฉ์ด๋ค.
์ด๋ ๊ฒ ๋ฐ๊ฟ๋ฒ๋ฆฐ๋ค.
์ ๊ฑด ์ผ๋ฐฉ์ ์ธ ์นํ์ด๊ณ ,
์๋ก ์นํ๋๊ฒ ํ๋ ค๋ฉด ๊ทธ๋ฅ ์ด๋ ๊ฒ ์ฝค๋ง๋ก๋ง ๊ตฌ๋ถํด์ ๋์ ธ์ฃผ๋ฉด ๋๋ค.

๊ทธ๋ฌ๋ฉด ๋์์ด ๋ชฉ๋ก์ ์ ๋ถ ํ ํฐ์ผ๋ก ๋ฃ์ด๋ฒ๋ฆฐ๋ค.

์ธ๋ฑ์ค์ ์ ์ฉํ๊ธฐ
๊ทธ๋ฐ๋ฐ ์ ๋ ๊ฒ ํ
์คํธํด๋ณด๊ธฐ๋ง ํ๋ฉด ๋ญํ๊ฒ ๋๊ฐ. ์ค์ ๋ก ๋ถ์ฌ์ ์จ์ผ ์๋ฏธ๊ฐ ์์ง.
์ ๋๋ผ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํด์ ์ธ๋ฑ์ค์ ์ถ๊ฐํ ์ ์๋ค.
settings.analysis ์ ์ด๋ค.
PUT test6
{
"settings": {
"analysis": {
"analyzer": {
"korean": {
"type": "custom",
"tokenizer": "nori",
"filter": ["my_synonym"],
"char_filter": []
}
},
"filter": {
"my_synonym": {
"type": "synonym",
"synonyms": [
"shampoo, ์ผํธ => ์ดํจ, ์ดํธ"
]
}
},
"tokenizer": {
"nori": {
"decompound_mode": "mixed",
"type": "nori_tokenizer",
"user_dictionary":"user_dictionary.txt"
}
}
}
},
"mappings": {
...
}
}
analysis.filter ์ ๋ก ํ ํฐํํฐ๋ฅผ ์ ์ํด๋๊ณ , analysis.tokenizer ์ ๋ก ํ ํฌ๋์ด์ ๋ฅผ ์ ์ํด์,
analysis.analyzer ์ ์ ์ ์ํด๋ ๊ฒ๋ค์ ๊ผฝ์์ฐ๋ ์์ด๋ค.
์์์๋ korean ์ ๋ก ํ๊ตญ์ด์๋ง ์๋์ผ๋ก ์ ๋๋ผ์ด์ ๊ฐ ์๋ํ๊ฒ ํด๋ ๊ฒ์ด๊ณ , ๊ทธ๋ฅ ์์ ๋ํดํธ๋ก ํ๋ ค๋ฉด ํค๊ฐ์ default๋ก ํ๋ฉด ๋๋ค.

์ ๋๋ผ์ด์ ์ด๋ฆ์ "korean" ๊ฐ์ ์ธ์ด๋ช ์ด๋ default ๋ฑ ์์ฝ๋ ์ด๋ฆ์ผ๋ก ํด๋์ง ์์ผ๋ฉด ๊ทธ๋ฅ ๋ฑ๋ก๋ง ๋๊ณ , ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ์ด ๋์ง ์๋๋ค.
๊ทธ๋ ๋ค.
์ฐธ์กฐ
https://esbook.kimjmin.net/06-text-analysis/6.2-text-analysis
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-custom-analyzer.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-synonym-tokenfilter.html