[MySQL] match ... against ํ๊ธ์ ๊ฒ์ ์ค๋ฅ (innodb_ft_min_token_size, ngram_token_size)
๊ฐ์
SELECT * FROM articles_cn WHERE MATCH(ner_text) AGAINST('็ซ' IN BOOLEAN MODE);
์ด ์ฟผ๋ฆฌ๋ก ๊ฒ์์ ํ๋, ์๋ฌด๊ฒ๋ ์ถ๋ ฅ๋ฐ์ง ๋ชปํ๋ค.
ํน์๋ ํด์ ๋ค๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํด ๊ฒ์ํ์ ๋
SELECT * FROM articles_cn WHERE JSON_CONTAINS(ner, '"็ซ"');
์ ๋์จ๋ค.. ๋ญ ๋๋ฌธ์ ์๋์ค๋ ๊ฑธ๊น?
ํ์ธ
CREATE TABLE `articles_cn` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`content` text NOT NULL,
`ner` json,
`ner_text` text,
PRIMARY KEY (`id`),
FULLTEXT KEY `idx_ner_text` (`ner_text`) WITH PARSER ngram
) ENGINE=InnoDB;
์ ํ ์ด๋ธ์ ์ด DDL๋ก ์์ฑ๋์๋ค.
ner_text๋ฅผ FULLTEXT KEY๋ก ๋ฑ๋กํด์ ์ฌ์ฉํ๊ณ ์๋ค.
๊ทธ๋์ ngram ์ค์ ์ ๋จผ์ ํ์ธํ๋ค.
SHOW VARIABLES LIKE 'ngram_token_size';
→ MySQL์ ngram ํ์๋ฅผ ์ฌ์ฉํ ๋ Default token size = 2๋ก ์ค์ ๋์ด์๊ธฐ๋๋ฌธ์
1๊ธ์์ง๋ฆฌ ๋จ์ด๋ ์ธ๋ฑ์ค์ ๋ฑ๋ก๋์ง ์๋๋ค.
์งํ
1. my.cnf ํ์ผ ์์ (my.cnf ๊ด๋ จํด์ ์ด์๊ฐ ์์๋ค ใ ใ -> ์ ๋ฆฌ: https://bonory.tistory.com/166)
[mysqld]
innodb_ft_min_token_size = 1
2. mysql restart
3. ngram_token_size ํ์ธ
SHOW VARIABLES LIKE 'ngram_token_size';
4. ํ ์ด๋ธ ์ญ์ ํ ์ฌ์์ฑ / index ์ญ์ ํ ์ฌ์์ฑ ํ ํ ์คํธ
SELECT * FROM articles_cn WHERE MATCH(ner_text) AGAINST('็ซ' IN BOOLEAN MODE);
์ค์ ํ๊ธ์๋ ์ ๊ฒ์๋๋ค !!!