안녕하세요 ! 현재 MySQL 5.5에 은전한닢 플러그인과 사전을 등록하여 Fulltext 검색 테이블 테스트 중에 있습니다.
저희가 검색 관련 서비스를 곧 런칭 할 예정인데 검색 부분을 다루는 것은 처음이라 많이 부족하네요..
MySQL 5.5 설치 이 후 은전한닢 플러그인 설치 및 사전 사용자 키워드 추가 부분까지도 잘 되는 것 같습니다.
MySQL에서 플러그인 인식까지도 잘 되는데 문제는 실제 Fulltext 검색 Query 결과가 사전을 거치지 않고 출력되는 것 같습니다.
예를 들면 '한타(한인타운의 준말)'라는 새로운 키워드를 사전에 등록하고 mecab으로 잘 분류되는 것 까지 확인하였으나 MySQL Fulltext Query에서 Match(), Against()를 사용하여 검색하면 출력이 안되는 그런 상황입니다.
(Like 검색은 아주 잘 됩니다..)
그래서 일단 제가 지금까지 작업한 내역을 아래에서 나열하였습니다.
보시고 문제되는 점이나 추가적으로 봐야할 점이 있다면 가감없이 조언 주시면 감사하겠습니다..ㅠㅠ
[버전 정보 확인]
OS : CentOS 6.9
DBMS : MySQL 5.5
MeCab : mecab-0.996-ko-0.9.2
MeCab 사전(Dic) : mecab-ko-dic-2.0.2-20170922
[MySQL 5.5 설치]
# yum --enablerepo=webtatic install mysql55w-server mysql55w-devel
[MeCab 설치]
# tar xvfz mecab-0.996-ko-0.9.2.tar.gz
# cd mecab-0.996-ko-0.9.2
# ./configure
# make
# make install
[MeCab 한글 사전(Dic) 설치]
# tar xvfz mecab-ko-dic-2.0.2-20170922.tar.gz
# cd mecab-ko-dic-2.0.2-20170922
# ./configure
# make
# make install
[MeCab 사전(Dic) 경로 설정]
# vi /usr/local/etc/mecabrc
dicdir = /usr/local/lib/mecab/dic/mecab-ko-dic
[MySQL 설정 파일에 Plugin 시작 등록 및 mecabrc 파일 경로 등록]
# vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
key_buffer_size = 1024M
max_allowed_packet = 16M
table_open_cache = 512
sort_buffer_size = 8M
read_buffer_size = 2M
read_rnd_buffer_size = 16M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 100M
thread_concurrency = 8
max_connections = 2000
wait_timeout = 300
interactive_timeout = 300
max_user_connections=500
max_connect_errors=10000
ignore_builtin_innodb
default_storage_engine=MyISAM
slow_query_log
skip-name-resolve
skip-external-locking
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
ft_min_word_len=2
character-set-client-handshake=FALSE
init_connect="SET collation_connection = utf8_general_ci"
init_connect="SET NAMES utf8"
character-set-server=utf8
collation-server=utf8_general_ci
secure_file_priv=""
plugin-load=mysql_ko_ftparser=mysql_ko_ftparser.so
loose-mecab-rc-file=/usr/local/etc/mecabrc
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pi
[myisamchk]
ft_min_word_len=2
* 위 MySQL 설정 중에 아래의 세 줄을 추가하였습니다
plugin-load=mysql_ko_ftparser=mysql_ko_ftparser.so
loose-mecab-rc-file=/usr/local/etc/mecabrc
ft_min_word_len=2
* ft_min_word_len 옵션 같은 경우에는 1 이나 2로 계속 바꿔가면서 테스트 해 보았습니다.
[MySQL 데몬 재시작]
# service mysqld restart
Stopping mysqld: [ OK ]
Starting mysqld: [ OK ]
[Git 설치]
# yum install http://opensource.wandisco.com/centos/6/git/x86_64/wandisco-git-release-6-1.noarch.rpm
# yum --enablerepo=WANdisco-git install git
# git --version
git version 2.11.1
[한글 FullText Parser Plugin 컴파일]
# git clone https://github.com/mysqlguru/mysql-ko-ftparser
# cd mysql-ko-ftparser/
# make
# make install
cp mysql-ko-ftparser.so `mysql_config --plugindir`
[Mecab 라이브러리 파일 확인]
# find / * -name libmecab.so.2
/usr/local/lib/libmecab.so.2
[Mecab 라이브러리 등록]
# vi /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/lib/
# ldconfig
# ldconfig -p | grep libmecab
libmecab.so.2 (libc6,x86-64) => /usr/local/lib/libmecab.so.2
libmecab.so (libc6,x86-64) => /usr/local/lib/libmecab.so
[MySQL 접속 후 mysql_ko_ftparser Plugin 등록]
# mysql -uroot -p
mysql> INSTALL PLUGIN mysql_ko_ftparser SONAME 'mysql-ko-ftparser.so';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
[mysql_ko_ftparser 플러그인 적용 확인]
mysql> SHOW PLUGINS;
| mysql_ko_ftparser | ACTIVE | FTPARSER | mysql-ko-ftparser.so | GPL |
<< 여기까지가 설치 과정입니다 >>
<< 이제부터 Fulltext Table 생성 과정입니다 >>
[Fulltext 테이블 생성]
# mysql -uroot -p
mysql> CREATE DATABASE search_enjeon;
Query OK, 0 rows affected (0.00 sec)
mysql> use search_enjeon;
Database changed
mysql> CREATE TABLE search_enjeon
-> (
-> id INT AUTO_INCREMENT NOT NULL,
-> seq INT,
-> content_type_seq INT,
-> content_type_subname varchar(100),
-> user_id varchar(20),
-> title varchar(100),
-> content TEXT,
-> image_path varchar(200),
-> inputDate timestamp,
-> insertDate timestamp,
-> updateDate timestamp,
-> PRIMARY KEY(id),
-> FULLTEXT KEY user_id (user_id) WITH PARSER mysql_ko_ftparser,
-> FULLTEXT KEY title (title) WITH PARSER mysql_ko_ftparser,
-> FULLTEXT KEY content (content) WITH PARSER mysql_ko_ftparser
-> ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.00 sec)
이렇게 파서를 mysql_ko_ftparser로 지정하고 Fulltext Table을 생성하였습니다.
그리고 이 테이블에 Fulltext용 검색 데이터를 Import 시켰습니다.
* Fulltext 테이블을 만드는 과정이 구글링에서 여러가지 방법이 있어 다양하게 만들어 테스트 해보았습니다..
다른 시도 1 : FULLTEXT INDEX title (title) WITH PARSER mysql_ko_ftparser
다른 시도 2 : FULLTEXT INDEX title (title) COMMENT PARSER mysql_ko_ftparser
다른 시도 3 : FULLTEXT KEY title (title) COMMENT PARSER mysql_ko_ftparser
* 다른 모든 시도 결과 제가 원하는 결과는 아니었으나 어떤 경우는 사용자 키워드 사전 추가 적용이 반응이 있는 경우가 있기도 하였습니다.
[‘한타’라는 키워드가 사전에 등록되어 있는지 확인]
# cd mecab-ko-dic-2.0.2-20170922
# find ./ -name "*.csv" | xargs egrep 한타 --color
결과 없음
[‘한타’라는 키워드를 사용자 사전에 등록]
# vi user-dic/place.csv
1차시도 : 한타,1789,3538,3534,NNP,지명,F,한타,*,*,*,*
2차시도 : 한타,1786,3545,5100,NNP,지명,F,한타,*,*,*,*
위 ID들을 한번씩 시도해보았습니다.
# ./autogen.sh
Looking in current directory for macros.
# ./tools/add-userdic.sh
generating userdic...
nnp.csv
/root/mecab-ko-dic-2.0.2-20170922/tools/../model.def is not a binary model. reopen it as text mode...
reading /root/mecab-ko-dic-2.0.2-20170922/tools/../user-dic/nnp.csv ...
done!
person.csv
/root/mecab-ko-dic-2.0.2-20170922/tools/../model.def is not a binary model. reopen it as text mode...
reading /root/mecab-ko-dic-2.0.2-20170922/tools/../user-dic/person.csv ...
done!
place.csv
/root/mecab-ko-dic-2.0.2-20170922/tools/../model.def is not a binary model. reopen it as text mode...
reading /root/mecab-ko-dic-2.0.2-20170922/tools/../user-dic/place.csv ...
done!
cd . && /bin/sh ./config.status Makefile
config.status: creating Makefile
test -z "model.bin matrix.bin char.bin sys.dic unk.dic" || rm -f model.bin matrix.bin char.bin sys.dic unk.dic
/usr/local/libexec/mecab/mecab-dict-index -d . -o . -f UTF-8 -t UTF-8
reading ./unk.def ... 13
emitting double-array: 100% |###########################################|
reading ./EP.csv ... 51
reading ./Symbol.csv ... 16
reading ./XSA.csv ... 19
reading ./Wikipedia.csv ... 36762
reading ./Foreign.csv ... 11600
reading ./XSN.csv ... 124
reading ./VCP.csv ... 9
reading ./NNG.csv ... 205269
reading ./MAJ.csv ... 240
reading ./XR.csv ... 3637
reading ./NR.csv ... 482
reading ./user-place.csv ... 2
reading ./VX.csv ... 125
reading ./NNB.csv ... 140
reading ./IC.csv ... 1305
reading ./MM.csv ... 453
reading ./VV.csv ... 7331
reading ./XPN.csv ... 83
reading ./Place-address.csv ... 19301
reading ./NNP.csv ... 2371
reading ./VA.csv ... 2360
reading ./Preanalysis.csv ... 5
reading ./Place.csv ... 30301
reading ./NP.csv ... 342
reading ./J.csv ... 416
reading ./Person.csv ... 196460
reading ./Place-station.csv ... 1145
reading ./Group.csv ... 3176
reading ./EC.csv ... 2547
reading ./Hanja.csv ... 124570
reading ./user-person.csv ... 1
reading ./ETN.csv ... 14
reading ./VCN.csv ... 7
reading ./EF.csv ... 1820
reading ./user-nnp.csv ... 2
reading ./XSV.csv ... 23
reading ./CoinedWord.csv ... 148
reading ./MAG.csv ... 14243
reading ./NorthKorea.csv ... 3
reading ./Person-actor.csv ... 99230
reading ./Inflect.csv ... 44819
reading ./NNBC.csv ... 677
reading ./ETM.csv ... 133
emitting double-array: 100% |###########################################|
reading ./matrix.def ... 3815x2690
emitting matrix : 100% |###########################################|
done!
echo To enable dictionary, rewrite /usr/local/etc/mecabrc as \"dicdir = /usr/local/lib/mecab/dic/mecab-ko-dic\"
To enable dictionary, rewrite /usr/local/etc/mecabrc as "dicdir = /usr/local/lib/mecab/dic/mecab-ko-dic"
# make install
make[1]: Entering directory `/root/mecab-ko-dic-2.0.2-20170922'
make[1]: Nothing to be done for `install-exec-am'.
test -z "/usr/local/lib/mecab/dic/mecab-ko-dic" || /bin/mkdir -p "/usr/local/lib/mecab/dic/mecab-ko-dic"
/usr/bin/install -c -m 644 model.bin matrix.bin char.bin sys.dic unk.dic left-id.def right-id.def rewrite.def pos-id.def dicrc '/usr/local/lib/mecab/dic/mecab-ko-dic'
make[1]: Leaving directory `/root/mecab-ko-dic-2.0.2-20170922'
[MySQL 데몬 재시작]
# service mysqld restart
Stopping mysqld: [ OK ]
Starting mysqld: [ OK ]
[‘한타’라는 키워드가 사전에 등록되어 있는지 확인]
# find ./ -name "*.csv" | xargs egrep 한타 --color
./user-place.csv:한타,1786,3545,5100,NNP,지명,F,한타,*,*,*,*
./user-dic/place.csv:한타,1786,3545,5100,NNP,지명,F,한타,*,*,*,*
* ./user-dic/place.csv 파일에 등록했는데 ./user-place.csv 파일에도 등록이 되네요.
[MeCab으로 사전 분석이 잘 이루어지는지 확인(키워드 : 한타)]
# mecab -d /usr/local/lib/mecab/dic/mecab-ko-dic
EOS
한타
한타 NNP,지명,F,한타,*,*,*,*
EOS
한타에서 만나요
한타 NNP,지명,F,한타,*,*,*,*
에서 JKB,*,F,에서,*,*,*,*
만나 VV,*,F,만나,*,*,*,*
요 EC,*,F,요,*,*,*,*
EOS
한타로 오세요
한타 NNP,지명,F,한타,*,*,*,*
로 JKB,*,F,로,*,*,*,*
오 VV,*,F,오,*,*,*,*
세요 EP+EF,*,F,세요,Inflect,EP,EF,시/EP/*+어요/EF/*
EOS
* MeCab에서는 ‘한타’라는 키워드가 정상적으로 사전 분석이 되는 것을 확인할 수 있었습니다.
[MySQL에서 Like 구문으로 검색하는 경우(검색어 : 한타)]
mysql> SELECT * FROM search_enjeon.search_enjeon where title like '%한타%';
3 18:46:43 SELECT * FROM search_enjeon.search_enjeon where title like '%한타%' LIMIT 0, 1000 30 row(s) returned
[MySQL에서 Fulltext 방식(Match(), Against() 사용)으로 검색하는 경우(검색어 : 한타)]
mysql> SELECT title, match(title) against('한타') as score FROM search_enjeon.search_enjeon where match(title) against('한타');
3 18:44:11 SELECT title, match(title) against('한타') as score FROM search_enjeon.search_enjeon where match(title) against('한타') LIMIT 0, 1000 0 row(s) returned
일반 Like로 검색했을 때 결과가 30개가 나오는 반면 Fulltext 방식을 사용하여 검색하였을 때는 결과가 하나도 나오지 않았습니다. ‘한타’라는 키워드 이외에 다른 키워드는 왠만하면 검색이 되는데요.
문제는 MeCab 사전(Dic)을 등록하건 등록하지 않건 MySQL Fulltext 쿼리에는 영향을 주지 않는 것 같은 느낌이 강하게 듭니다. 이 문제로 며칠동안 Fulltext Table을 정말 수백번은 지웠다가 다시 생성하고 그랬네요…
머리가 나쁘면 몸이 고생한다고..ㅠㅠ
Fulltext Table을 만드는 과정에서 문제가 있는 것인지.. 아니면 제가 또 설치해줘야 하는 MeCab 프로그램이 있는 것인지.. 아니면 MeCab 설정이나 MySQL 설정 관련하여 잘못한게 있는건지.. 그것도 아니라면 MySQL 5.5에서 지금 이 은전한닢 플러그인이 뭔가 호환이 안되는 것인지..
정말 혼자서 며칠 째 삽질해봐도 도저히 답이 안나오네요..ㅠㅠ
구글링을 해서 여기까지 왔는데 여기서 주저앉으면 너무 억울할 것 같네요 ㅎㅎ 하하..
혹시 이 글을 보신다면.. 단 한마디의 조언이라도 주저없이 말씀해주시면 너무너무 감사하겠습니다 !!
그럼 좋은 하루 보내세요 ! ^^