์ด ๊ธ์ ๊น์ข ๋ฏผ(kimjmin@gmail.com)๋์ ๊ธ์ ๋๋ค. ๋ฌด๋จ ๋ณต์ /์์ ์ ๊ธํฉ๋๋ค.
Elasticsearch๋ ๋น ๋ฅธ ๊ฒ์์ ์ํด ๊ฒ์์ ์ฌ์ฉ๋ ํ ๋ค์ ๋ฏธ๋ฆฌ ๋ถ๋ฆฌํด์ ์ญ ์ธ๋ฑ์ค์ ์ ์ฅํฉ๋๋ค. ํ์ง๋ง ๊ณผํ ์ฉ์ด์ง ๊ฒ์ ๊ฐ์ ํน์ ํ ์ฌ์ฉ ์ฌ๋ก์ ๋ฐ๋ผ ํ ์ด ์๋ ๋จ์ด์ ์ผ๋ถ๋ง ๊ฐ์ง๊ณ ๋ ๊ฒ์ํด์ผ ํ๋ ๊ธฐ๋ฅ์ด ํ์ํ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. RDBMS์ LIKE ๊ฒ์ ์ฒ๋ผ ์ฌ์ฉํ๋ wildcard ์ฟผ๋ฆฌ๋ regexp (์ ๊ท์) ์ฟผ๋ฆฌ๋ ์ง์์ ํ์ง๋ง, ์ด๋ฐ ์ฟผ๋ฆฌ๋ค์ ๋ฉ๋ชจ๋ฆฌ ์๋ชจ๊ฐ ๋ง๊ณ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ Elasticsearch์ ์ฅ์ ์ ํ์ฉํ์ง ๋ชปํฉ๋๋ค. ์ด๋ฐ ์ฌ์ฉ์ ์ํด ๊ฒ์ ํ ์ ์ผ๋ถ๋ง ๋ฏธ๋ฆฌ ๋ถ๋ฆฌํด์ ์ ์ฅ์ ํ ์ ์๋๋ฐ ์ด๋ ๊ฒ ๋จ์ด์ ์ผ๋ถ๋ฅผ ๋๋ ๋ถ์๋ฅผ NGram ์ด๋ผ๊ณ ํฉ๋๋ค. ๋ณดํต์ unigram(์ ๋๊ทธ๋จ – 1๊ธ์), bigram(๋ฐ์ด๊ทธ๋จ - 2์) ๋ฑ์ผ๋ก ๋ถ๋ฆ ๋๋ค.
Elasticsearch๋ NGram์ ์ฒ๋ฆฌํ๋ ํ ํฐ ํํฐ๋ฅผ ์ ๊ณตํ๋ฉฐ ์ค์ ์ "type": "nGram" ์ผ๋ก ํฉ๋๋ค. "house" ๋ผ๋ ๋จ์ด๋ฅผ 2 ๊ธ์์ NGram (bigram) ์ผ๋ก ์ฒ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด "ho", "ou", "us", "se" ์ด 4๊ฐ์ ํ ํฐ๋ค์ด ์ถ์ถ๋ฉ๋๋ค. ngram ํ ํฐํํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ ๊ฒ 2๊ธ์์ฉ ์ถ์ถ๋ ํ ๋ค์ด ๋ชจ๋ ๊ฒ์ ํ ํฐ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค. ์ด์ ์ด ์ธ๋ฑ์ค์ ๊ฒฝ์ฐ์๋ ๊ฒ์์ด๋ฅผ "ho" ๋ผ๊ณ ๋ง ๊ฒ์์ ํด๋ house ๊ฐ ํฌํจ๋ ๋ํ๋จผํธ๋ค์ด ๊ฒ์์ด ๋ฉ๋๋ค.
์ฃผ์ : ngram ํ ํฐํํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ฅ๋๋ ํ ์ ๊ฐฏ์๋ ๊ธฐํ๊ธ์์ ์ผ๋ก ๋์ด๋๊ณ ๊ฒ์์ด๋ฅผ "ho"๋ก ๊ฒ์ ํ์ ๋ house, shoes ์ฒ๋ผ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์์ํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ธ ํ ์คํธ ๊ฒ์์๋ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ngram์ ์ฌ์ฉํ๊ธฐ ์ ํฉํ ์ฌ๋ก๋ ์นดํ ๊ณ ๋ฆฌ ๋ชฉ๋ก์ด๋ ํ๊ทธ ๋ชฉ๋ก๊ณผ ๊ฐ์ด ์ ์ฒด ๊ฐ์๊ฐ ๋ง์ง ์์ ๋ฐ์ดํฐ ์ง๋จ์ ์๋์์ฑ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐ์ ์ ํฉํฉ๋๋ค.
ngram ํ ํฐ ํํฐ์๋ min_gram (๋ํดํธ 1), max_gram (๋ํดํธ 2) ์ต์ ์ด ์์ต๋๋ค. ์ง์ํ ์ ์๋ฏ์ด ์ต์, ์ต๋ ๋ฌธ์์์ ํ ํฐ์ ๊ตฌ๋ถํ๋ ๋จ์์ ๋๋ค. house๋ฅผ "min_gram": 2, "max_gram": 3 ์ผ๋ก ์ค์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ถ์๋์ด ์ด 7๊ฐ์ ํ ํฐ์ ์ ์ฅํฉ๋๋ค.
๋ค์์ my_ngram ์ธ๋ฑ์ค์ "min_gram": 2, "max_gram": 3 ์ธ my_ngram_f ํ ํฐํํฐ๋ฅผ ๋ง๋ค๊ณ house ๋ฅผ ๋ถ์ํ๋ ์์ ์ ๋๋ค.
my_ngram ์ธ๋ฑ์ค ์์ฑ
PUT my_ngram
{
"settings": {
"analysis": {
"filter": {
"my_ngram_f": {
"type": "nGram",
"min_gram": 2,
"max_gram": 3
}
}
}
}
}
Request
my_ngram_f ํ ํฐํํฐ๋ก "house" ๋ถ์
GET my_ngram/_analyze
{
"tokenizer": "keyword",
"filter": [
"my_ngram_f"
],
"text": "house"
}
Response
my_ngram_f ํ ํฐํํฐ๋ก "house" ๋ถ์ ๊ฒฐ๊ณผ
{
"tokens" : [
{
"token" : "ho",
"start_offset" : 0,
"end_offset" : 5,
"type" : "word",
"position" : 0
},
{
"token" : "hou",
"start_offset" : 0,
"end_offset" : 5,
"type" : "word",
"position" : 0
},
{
"token" : "ou",
"start_offset" : 0,
"end_offset" : 5,
"type" : "word",
"position" : 0
},
{
"token" : "ous",
"start_offset" : 0,
"end_offset" : 5,
"type" : "word",
"position" : 0
},
{
"token" : "us",
"start_offset" : 0,
"end_offset" : 5,
"type" : "word",
"position" : 0
},
{
"token" : "use",
"start_offset" : 0,
"end_offset" : 5,
"type" : "word",
"position" : 0
},
{
"token" : "se",
"start_offset" : 0,
"end_offset" : 5,
"type" : "word",
"position" : 0
}
]
}
'...' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Node.js] Socket.io Cors(ํฌ๋ก์ค ๋๋ฉ์ธ) ํด๊ฒฐํ๊ธฐ (0) | 2021.08.24 |
---|---|
[Docker] ์ปจํ ์ด๋ ์ด๋ฏธ์ง ์์๋ณด๊ธฐ (0) | 2021.08.24 |
[Kubernetes] ๋ฐฐํฌ๋ ํ๋์ ์ธ๋ถ ๊ฐ์ ํ์ธํ๋ ๋ฐฉ๋ฒ (0) | 2021.08.24 |
[Kubernetes] ํ๋(pods)์ ๋์ ๋ณด์ฆ ๊ธฐ๋ฅ (0) | 2021.08.24 |
[Kubernetes] kubectl exec -it ๋ช ๋ น์ด์์ -- ์๋ฏธ (0) | 2021.08.24 |