15
21

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-08-16

全文検索とは

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

テキスト情報の抽出方法

方式 (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)

15
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
21