MySQL 日本語全文検索について


#全文検索とは

・全文検索とは、複数の文書ファイルから特定の文字列（キーワード）を検索する技術を指します。
・特定の文字列（キーワード）をあらかじめ索引情報（インデックス化）を準備する事で、検索を高速化する事が出来ます。

##テキスト情報の抽出方法
| 方式 | (Index)速度 | 検索速度 | 分かち書き単語数 | 検索漏れ | デメリット |
|:-:|:-:|:-:|:-:|:-:|:-:|
| N-Gram  | 早い  | 普通  | 多い  | 無し  | 関連性が低い  |
| Mecab  | 遅い  | 早い  | 少ない  | 有り  | 辞書の更新  |


例）東京都で、豊島さんの結婚式だよ。

#####◆N-Gram(バイグラム)
東京
京都
都で
で、
、豊
豊島
島さ
さん
んの
の結
結婚
婚式
式だ
だよ
よ。

#####◆mecab
fwww01:/usr/local/src/mecab-ipadic-2.7.0-20070801> mecab
東京    名詞,固有名詞,地域,一般,*,*,東京,トウキョウ,トーキョー
都      名詞,接尾,地域,*,*,*,都,ト,ト
で      助詞,格助詞,一般,*,*,*,で,デ,デ
、      記号,読点,*,*,*,*,、,、,、
豊島    名詞,固有名詞,人名,姓,*,*,豊島,トシマ,トシマ
さん    名詞,接尾,人名,*,*,*,さん,サン,サン
の      助詞,連体化,*,*,*,*,の,ノ,ノ
結婚式  名詞,一般,*,*,*,*,結婚式,ケッコンシキ,ケッコンシキ
だ      助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
よ      助詞,終助詞,*,*,*,*,よ,ヨ,ヨ
。      記号,句点,*,*,*,*,。,。,。


■MySQL 5.7.6以降より、標準でngram Full-Text Parser Pluginもしくは、MeCab Full-Text Parser Pluginを利用出来るようになりました。
http://qiita.com/terukizm/items/858bd63daa2c4dba7829


#####◆ngram
my.cnf
[mysqld]
innodb_ft_min_token_size=2

＞ALTER TABLE people ADD FULLTEXT KEY (nickname) WITH PARSER ngram;
＞ALTER TABLE people ADD FULLTEXT KEY (nickname, self_introduction) WITH PARSER ngram;

#####◆形態素解析(MeCab)
my.cnf
[mysqld]
# MeCab Full-Text Parser Plugin Settings
loose-mecab-rc-file=/etc/mecabrc
innodb_ft_min_token_size=2

mysql> INSTALL PLUGIN mecab SONAME 'libpluginmecab.so';
Query OK, 0 rows affected (0.14 sec)

mysql> SHOW PLUGINS;
+----------------------------+----------+--------------------+----------------------+---------+
| Name                       | Status   | Type               | Library              | License |
+----------------------------+----------+--------------------+----------------------+---------+
| mecab                      | ACTIVE   | FTPARSER           | libpluginmecab.so    | GPL     |
+----------------------------+----------+--------------------+----------------------+---------+

mysql> SHOW STATUS LIKE 'mecab_charset';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| mecab_charset | utf8  |
+---------------+-------+

vi /etc/mecabrc
# 変更
;dicdir = /usr/lib64/mecab/dic/ipadic
dicdir = /usr/lib64/mysql/mecab/dic/ipadic_euc-jp


mysql> SHOW STATUS LIKE 'mecab_charset';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| mecab_charset | ujis  |
+---------------+-------+

ALTER TABLE people ADD FULLTEXT INDEX idx_nickname (`nickname`) WITH PARSER mecab;


#構文

■全文検索種類

・自然言語検索
＞IN NATURAL LANGUAGE MODE
・ブール検索
＞IN BOOLEAN MODE

mysql> select nickname from people where match(nickname) against ('"日暮里"' in NATURAL LANGUAGE MODE);
+---------------------+
| nickname            |
+---------------------+
| 日暮里              |
| 日暮里              |
| 日暮里              |
| 日暮里最高          |
| ピエール新日暮里3世 |
| 日暮 里吉           |
| 日暮かごめ          |
| 日暮かごめ          |
| 日暮かごめ          |
| 日暮新太郎          |
| 日暮かごめ          |
| その日暮らし        |
| その日暮らし        |
+---------------------+
13 rows in set (0.03 sec)

mysql> select nickname from people where match(nickname) against ('"日暮里"' in boolean mode);
+---------------------+
| nickname            |
+---------------------+
| 日暮里              |
| 日暮里最高          |
| ピエール新日暮里3世 |
| 日暮里              |
| 日暮里              |
+---------------------+
5 rows in set (0.00 sec)

mysql> select nickname from people where match(nickname) against ('+"日暮里" +"3世"' in boolean mode);
+---------------------+
| nickname            |
+---------------------+
| ピエール新日暮里3世 |
+---------------------+
1 row in set (0.00 sec)

mysql> select nickname from people where match(nickname) against ('+"日暮里" -"3世"' in boolean mode);
+------------+
| nickname   |
+------------+
| 日暮里     |
| 日暮里最高 |
| 日暮里     |
| 日暮里     |
+------------+
4 rows in set (0.00 sec)