0. ํ์ต ๋ชฉ์
- '๋ถ์ฉ์ด์ ์ผ์นํ๊ฑฐ๋, ๋ถ์ฉ์ด๋ฅผ ํฌํจํ๋ ํ ํฐ์ ์ธ๋ฑ์ค ๋ฑ๋ก์์ ์ ์ธ' ๋ผ๋ ๋ป์ ์๋ฏธ๊ฐ ๋ช ํํ ์ดํด๋์ง ์์ ์ค์ตํจ.
- ์ค์ต์ ํตํด ์ ์ฒด์ ์ธ ์ดํด๋ฅผ ํ๋ค.
1. ๊ฒฐ๋ก
n-gram์ผ๋ก ๋ถํ ํ์ ์ ๋ถํ ๋ ํ ํฐ์ด ๋ ์ค ํ๋๋ผ๋ ์ถฉ์กฑํ๋ฉด (๋ถ์ฉ์ด์ ์ผ์น ํน์ ๋ถ์ฉ์ด๋ฅผ ํฌํจ) ์ธ๋ฑ์ค ๋ฑ๋ก์์ ์ ์ธ๋ฉ๋๋ค.
๋ฐ๋ผ์ n-gram์ n์ด ํด์๋ก ์ ๋ฌธ ๊ฒ์ ์ธ๋ฑ์ค์ ์ฑ๋ฅ์ด ์ ํ๋ฉ๋๋ค.
2. ์ค์ตํ๊ธฐ
1. innodb ์ ์ฒด ํ ํฐ ์ค์ ์ 2-gram์ ๋ง์ถค
์ธ๋ถ ๊ณผ์ : [[MySQL์์ innodb_ft_min_token_size ๋ฐ๊พธ๊ธฐ]]
2. docs ํ ์ด๋ธ ์์ฑ
create table docs (
id int auto_increment primary key,
content text,
fulltext index ft_idx(content) with parser ngram
)engine=innodb;
์์ ๊ฐ
3. ๋ถ์ฉ์ด
๋ถ์ฉ์ด๋ innodb ๊ธฐ๋ณธ ๋ถ์ฉ์ด ๊ทธ๋๋ก ์ ๋๋ค.
4-1. ํ์ธ (์ผ์นํ๋ ๋ถ์ฉ์ด๊ฐ ์๋ ๊ฒฝ์ฐ)
ate๋ผ๋ ๋จ์ด๋ at + te๋ก ๋์ด์์ต๋๋ค.
์ฌ๊ธฐ์ at๋ ๋ถ์ฉ์ด ์
๋๋ค.
A. at๋ก ๊ฒ์ ์
์๋ฌด๊ฒ๋ ์ ๋น๋๋ค.
B. ์คํ๊ณํ ํ์ธ
-> Filter: (match docs.content against ('at' in boolean mode)) (cost=0.35 rows=1) (actual time=0.0038..0.0038 rows=0 loops=1)
-> Full-text index search on docs using ft_idx (content='at') (cost=0.35 rows=1) (actual time=0.0031..0.0031 rows=0 loops=1)
at๋ก ์ธ๋ฑ์ค ์กฐํ๋ฅผ ์๋ํ์์ด ๋ณด์
๋๋ค. at๊ฐ index ๋ด์ ์์ด์ ์๋ฌด ๊ฒฐ๊ณผ๋ ์ ๋ณด์ธ ๊ฒ์ ์ ์ ์์ต๋๋ค.
C. ๊ธฐ๋ณธ string๋ฌธ ๊ฒ์ ์
ate๊ฐ ๊ฒ์์ด ๋จ์ ํ์ธํ ์ ์์ต๋๋ค.
D. te๋ก ๊ฒ์ ์
์ ๋ฌธ ๊ฒ์ ์ธ๋ฑ์ค๋ก ๊ฒ์์ด ๋จ์ ํ์ธํ ์ ์์ต๋๋ค.
E. ์คํ๊ณํ ํ์ธ
-> Filter: (match docs.content against ('te' in boolean mode)) (cost=0.35 rows=1) (actual time=0.0131..0.0137 rows=1 loops=1)
-> Full-text index search on docs using ft_idx (content='te') (cost=0.35 rows=1) (actual time=0.0119..0.0123 rows=1 loops=1)
te๋ก ์ธ๋ฑ์ค ๊ฒ์ ํ ๊ฐ์ ์ฐพ์์์ ํ์ธํ ์ ์์ต๋๋ค.
F. ate๋ก ๊ฒ์ ์
ate๋ก ๊ฒ์ ์์๋ ์ฐพ์์ต๋๋ค.
G. ์คํ ๊ณํ ๋ถ์
-> Filter: (match docs.content against ('ate' in boolean mode)) (cost=0.35 rows=1) (actual time=0.013..0.0133 rows=1 loops=1)
-> Full-text index search on docs using ft_idx (content='ate') (cost=0.35 rows=1) (actual time=0.0115..0.0117 rows=1 loops=1)
ate ์์ฒด๋ก index ๊ฒ์์ ์๋ํ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ์๋ง ๋ด๋ถ์ ์ผ๋ก๋ at, te ๊ฐ๊ฐ ์๋ํ์ง ์์์๊น ์ถ์ต๋๋ค.
4-2 ํ์ธ (๋ถํ ๋ ํ ํฐ์ด ๋ถ์ฉ์ด๋ฅผ ํฌํจํ๋ ๊ฒฝ์ฐ)
6๋ฒ์ธ agagagaga๋ก ํด๋ณด๊ฒ ์ต๋๋ค.
์ฌ๊ธฐ์ ๋ถ์ฉ์ด๋ a ํ๋ ์
๋๋ค. ๋ง์ฝ์ ์ผ์นํ๋ ๊ฒฝ์ฐ๋ง ์ ์ธํ๋ค๋ฉด ag์ ga๋ก๋ ์ธ๋ฑ์ค ์์ฑ์ด ๋์ด์ผ ํฉ๋๋ค.
ํ์ง๋ง ๋ฐ์ ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ํ์ฌ ๊ฒ์์ด ์๋ฉ๋๋ค.
๋ง์ง๋ง ๊ฒฝ์ฐ๋ ์ ์ฒด์ธ๋ฐ๋ ๋ถ๊ตฌํ๊ณ ์ธ๋ฑ์ค ์์ฑ์ด ๋์ง ์์์ต๋๋ค.
์ดํ 7๋ฒ ๊ฒฝ์ฐ์ธ abcd์์ผ๋ก ์ ๋ถ ๋์ดํ ๊ฐ์ ๋ํด์๋ ์ค์ต ํด๋ณด๊ฒ ์ต๋๋ค.
ab๋ก๋ ๊ฒ์์ด ์๋ฉ๋๋ค. (a๊ฐ ab์ ํฌํจ)
abc๋ก๋ ๊ฒ์์ด ๋ฉ๋๋ค. (bc๋ ๋ถ์ฉ์ด๊ฐ ์๋)
๊ฒฐ๋ก
๋ฐ๋ผ์ ์ ๋ฌธ ๊ฒ์์ด ์ธ๋ฑ์ค ํ์ฉ ๊ฒ์์์, ๊ฒ์์ด ์ธ์๊ฐ n-gram์ผ๋ก ๋๋์์ ์, ๋ชจ๋ ๋ถ์ฉ์ด๊ฐ ํฌํจ๋๋ฉด ์ธ๋ฑ์ค ํ์ฉ์ด ์๋ฉ๋๋ค. ๋ง์ฝ n-gram์ n์ด ์ปค์ง์๋ก ํ๋์ ํ ํฐ์ ๋ถ์ฉ์ด๋ฅผ ํฌํจํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋๋ค. ๋ฐ๋ผ์ n์ด ํด์๋ก ๊ฒ์์ ํจ์จ์ฑ์ด ๋จ์ด์ง๋๋ค.
ํต์ฌ ์์ฝ
- ๋ถ์ฉ์ด์ ์ผ์นํ๊ฑฐ๋ ๋ถ์ฉ์ด๋ฅผ ํฌํจํ๋ ๋ชจ๋ ํ ํฐ์ ์ธ๋ฑ์ค ๋ฑ๋ก์์ ์ ์ธ๋๋ค.
- ๋ฐ๋ผ์ n-gram์ n์ ํฌ๊ธฐ๊ฐ ์ปค์ง์๋ก ํ๋์ ํ ํฐ์ด ๋ถ์ฉ์ด๋ฅผ ํฌํจํ ํ๋ฅ ์ด ์ปค์ง๋ฏ๋ก, ๊ฒ์์ ํจ์ฉ์ฑ์ด ๋จ์ด์ง๋ค.