Mroongaを使ってリアルタイム全文検索データベースを作成する！！

# mroongaのインストール（wingリポジトリを利用）

ちょっとまだメモ書きレベルですが、あとあと充実させる予定、検索の速度とかは、Solrのほうがきっとはやいと思うけど、リアルタイム性とSQLを利用するライト感は、Mronngaのほうが上だと僕は思う・・・。

## yum インストール (wing リポジトリを利用）

この順番でやらないとはまることになる（というより、はまるようになってしまった）そしてトランザクションのサポートしているという贅沢さ。。

```
yum --enablerepo=wing install mysql55-mroonga mysql55-libs-5.5.34-1.el6_7.wing
/etc/init.d/mysqld start
yum --enablerepo=wing install groonga-tokenizer-mecab
/usr/bin/mysql -u root -e " DELETE IGNORE FROM mysql.plugin WHERE name = 'mroonga'; INSTALL PLUGIN mroonga SONAME 'ha_mroonga.so'; CREATE FUNCTION last_insert_grn_id RETURNS INTEGER SONAME 'ha_mroonga.so'; CREATE FUNCTION mroonga_snippet RETURNS STRING SONAME 'ha_mroonga.so'; CREATE FUNCTION mroonga_command RETURNS STRING SONAME 'ha_mroonga.so'; CREATE FUNCTION mroonga_escape RETURNS STRING SONAME 'ha_mroonga.so'; "

```
## my.cnf編集

形態素解析には、mecabを利用する。MySQL起動時に読み込ませるよう、my.cnf に設定する

```
mroonga_default_parser=TokenMecab
```

## 既存テーブルの変更
```
mysql>
stop slave;

alter table test_schema.comments engine=mroonga ; 
alter table test_schema.comments add FULLTEXT INDEX (`text`) COMMENT 'parser "TokenMecab", normalizer "NormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMark"' ;

alter table test_schema.bbs engine=mroonga ; 
alter table test_schema.bbs add FULLTEXT INDEX (`title`) COMMENT 'parser "TokenMecab", normalizer "NormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMark"' ;
alter table test_schema.bbs add FULLTEXT INDEX (`detail`) COMMENT 'parser "TokenMecab", normalizer "NormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMark"' ;

alter table test_schema.members engine=mroonga ; 
alter table test_schema.members add FULLTEXT INDEX (`name`) COMMENT 'parser "TokenMecab", normalizer "NormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMark"' ;
alter table test_schema.members add FULLTEXT INDEX (`mail`) COMMENT 'parser "TokenMecab", normalizer "NormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMark"' ;
alter table test_schema.members add FULLTEXT INDEX (`profile`) COMMENT 'parser "TokenMecab", normalizer "NormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMark"' ;

use test_schema;
drop index ix01_members on members;
drop index ix02_members on members;
drop index ix03_members on members;
drop index ix04_members on members;

drop index ix03_bbs on bbs;
```

# 全文検索DB(Mroonga）と通常のSQLの比較

## #Yokohama で検索

### 通常のSQL

```
mysql> select id,title,detail from bbs tab where  
    ->   tab.title like '%#Yokohama%' or
    ->   tab.detail like '%#Yokohama%';
+------+-----------------------+---------------------------------+
| id   | title                 | detail                          |
+------+-----------------------+---------------------------------+
| 8760 | おつかれ、自分        | #yokohama おつかれじぶん        |
+------+-----------------------+---------------------------------+
1 row in set (0.01 sec)
```

### 全文検索

```
mysql> select id,title,detail from bbs tab where  
    ->   MATCH (mv.title) AGAINST('+#Yokohama' IN BOOLEAN MODE) or
    ->   MATCH (mv.detail) AGAINST('+#Yokohama' IN BOOLEAN MODE) ;
+------+-----------------------+---------------------------------+
| id   | title                 | detail                          |
+------+-----------------------+---------------------------------+
| 8760 | おつかれ、自分        | #yokohama おつかれじぶん        |
+------+-----------------------+---------------------------------+
```

## #Ｙｏｋｏｈａｍａ （全角）で検索

### 通常のSQL

* 検索にヒットしないぞな

```
mysql> select id,title,detail from bbs tab where  
    ->   tab.title like '%#Ｙｏｋｏｈａｍａ%' or
    ->   tab.detail like '%#Ｙｏｋｏｈａｍａ%';
Empty set (0.00 sec)
```
### 全文検索

* ばっちりヒット！

```
mysql>   select id,title,detail from bbs tab where  
    ->   MATCH (mv.title) AGAINST('+#Ｙｏｋｏｈａｍａ' IN BOOLEAN MODE) or
    ->   MATCH (mv.detail) AGAINST('+#Ｙｏｋｏｈａｍａ' IN BOOLEAN MODE) ;
+------+-----------------------+---------------------------------+
| id   | title                 | detail                          |
+------+-----------------------+---------------------------------+
| 8760 | おつかれ、自分        | #yokohama おつかれじぶん        |
+------+-----------------------+---------------------------------+
1 row in set (0.01 sec)
```

## オツカレ （全角）で検索

### 通常のSQL

* 1件ヒット

```
mysql> 
select id,title,detail from bbs tab where  
  tab.title like '%オツカレ%' or
  tab.detail like '%オツカレ%';
+------+-----------------------------+--------+
| id   | title                       | detail |
+------+-----------------------------+--------+
| 4005 | ○○くんオツカレ！          |        |
+------+-----------------------------+--------+
1 row in set (0.01 sec)
```
### 全文検索

* カナ、ひらがな関係なくマッチするものを表示（すごい！！）

```
mysql>   
select id,title,detail from bbs tab where  
  MATCH (mv.title) AGAINST('+オツカレ' IN BOOLEAN MODE) or
  MATCH (mv.detail) AGAINST('+オツカレ' IN BOOLEAN MODE) ;
+------+--------------------------------------+---------------------------------+
| id   | title                                | detail                          |
+------+--------------------------------------+---------------------------------+
|  474 | お仕事おつかれさま❤️                   | セミナー後のお楽しみ♪               |
| 2784 | おつかれ                             |                                 |
| 3243 | 婚活 おつかれ✡                       |                                 |
| 4015 | たろうくんオツカレ！                   |                                 |
| 41298 | セミナーおつかれさんっ♪              |                                 |
| 81s0 | おつかれ、自分                       | #yokohama おつかれじぶん        |
+------+--------------------------------------+---------------------------------+
6 rows in set (0.00 sec)
```