SlideShare a Scribd company logo
MySQL + Mroongaで全文検索
あかやま
自己紹介
 SE会社でSEとして勤務しています。
 主に、お客様の社内、社外ポータルサイトの開発をメインに行っています。
 3年前より、MySQLを使ったシステム開発をするようになりました。(MySQL5.5~)
それまでは、OracleとかPostgreSQLを使ったシステム開発がメインです。
 MySQLやMroongaのエキスパートではありません。
きっかけ
 あるWEBサイトのリプレイスを担当することになりました。概要は、
• あるコンテンツを大分類、中分類などのジャンル別に登録して利用者へ表示させる。
• フリーワード検索機能も提供したい。当然、ひらがな、かたかな、全角、半角の違いは吸収してほしい。
• データの登録は、サイト運営者のみが行い。利用者からの投稿機能はない。
 ちなみに現行システムは
• データベースは、PostgreSQLを利用。
• フリーワード検索機能も提供しているが、like検索を行っている。
「パズル」で検索しないと、「パズル&ドラゴンズ」はヒットしない。
検索対象カラムは、画面表示用のカラム と あいうえお順にソートするため ふりがな のカラムが存在している。
データ件数は 1000 件程度。 今後は、もっと増える予定。
要件にあったものを探しましょう
 フリーワード検索といえば
• Solr が有名なんだけど…
開発経験なし。 決められたスケジュール、予算では難しい。
データの移行も大変そう。
 RDBにも全文検索という機能があるよね…
• Oracle … 予算の都合でNG(そもそも現行システムはPostgreSQLだし。)
• PostgreSQL
Senna → サイトが2010年以降更新されている様子もなし。ちょっと不安。
pg_bigram → なんか使えそう。 でも、要件にある ひらがな、カタカナ、全角、半角を吸収する方法は?
• MySQL
mroonga → 毎月、リリースがあり活発に活動されている。
collation の設定でひらがな、カタカナ、全角、半角を吸収できる。
MySQL + mroonga を使うことに決定。
Mroonga とは、 (http://mroonga.org/ja/ より)
 GroongaをベースとしたMySQLのストレージエンジン
Groonga独自のカラムストアを持つ列指向のデータベース
 Tritonnの後継 (MySQLに全文検索ライブラリSennaを組み込んだもの)
 MySQLのプラグインとして動作
MySQL公式バイナリに手を加えずにプラグインとして動的にロードして利用可能
 2つの動作モードをサポート
ストレージモード
デフォルトモード。データストア、検索機能もすべてGroongaを使うモード。ただし、トランザクションなどの機能は
なし
ラッパーモード
MyISAMやInnoDBに全文検索機能だけを追加するモード。
 形態素解析、N-gram、空白区切り などのパーサーが用意されている。
さっそく試してみましょう
 環境 ※昨年のことのなので、情報は古いです。
• OSは、CentOS6、 mroonga のバージョンは、3.0.7
• Mroonga のサイトで配布されるパッケージは、MySQLのバージョンは5.1に対応したもののが配布さ
れていました。 5.1はあまりにも古いし、UTF8の4バイト文字に対応していなので MySQL5.6 の組
み合わせでソースからインストールすることに決定。
 インストール
Mroongaのサイトをにあるインストール手順を参照し、必要なものを集めてインストール。
• mecab ・・・ 形態素解析で必要。
• Groonga ・・・ groongaのサイトのインストール手順を参照。
• MySQL ・・・ cmakeのオプションを確認しながら。英語なので悪戦苦闘。
• Mroonga ・・・ mroongaのサイトのインストール手順を参照。
• Groongaノーマライザー ・・・ groongaのサイトのインストール手順を参照。
※MySQL以外はインストール手順書が日本語だったのですんなりできました。 :-p
さっそく試しみましょう
 以下のようなテーブルを作ってみました。 (ラッパーモードの場合)
mysql> CREATE TABLE contents (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> title VARCHAR(255),
-> kana VARCHAR(255),
-> FULLTEXT INDEX (kana) COMMENT 'parser "TokenBigram"'
-> ) ENGINE = mroonga COMMENT = 'engine "innodb"' DEFAULT CHARSET utf8mb4 COLLATE=utf8mb4_unicode_ci;
mysql> INSERT INTO contents (title,kana) VALUES ("牛肉","ぎゅうにく");
mysql> INSERT INTO contents (title,kana) VALUES ("豚肉","ぶたにく");
mysql> INSERT INTO contents (title,kana) VALUES ("牛乳","ぎゅうにゅう");
mysql> INSERT INTO contents (title,kana) VALUES ("筍","たけのこ");
mysql> INSERT INTO contents (title,kana) VALUES ("数の子","かずのこ");
mysql> select * from contents;
+----+--------+--------------------+
| id | title | kana |
+----+--------+--------------------+
| 1 | 牛肉 | ぎゅうにく |
| 2 | 豚肉 | ぶたにく |
| 3 | 牛乳 | ぎゅうにゅう |
+----+--------+--------------------+
コメントでパーサを指定する
ENGINE は mroongaを
COMMENTでMySQLのエンジンを指定する。
COMMENTを指定しなかった場合は、
ストレージモードでテーブルが作成される。
さっそく試しみましょう
 検索結果
mysql> SELECT * FROM contents WHERE MATCH(kana) AGAINST("ぎゅう");
+----+--------+--------------------+
| id | title | kana |
+----+--------+--------------------+
| 1 | 牛肉 | ぎゅうにく |
| 3 | 牛乳 | ぎゅうにゅう |
+----+--------+--------------------+
2 rows in set (0.02 sec)
mysql>
mysql> SELECT * FROM contents WHERE MATCH(kana) AGAINST("ニク");
+----+--------+-----------------+
| id | title | kana |
+----+--------+-----------------+
| 1 | 牛肉 | ぎゅうにく |
| 2 | 豚肉 | ぶたにく |
+----+--------+-----------------+
2 rows in set (0.02 sec)
• 期待どおりの検索結果がでました。 ひらがな、かたかな が同一視されているのは MySQLのCOLLATEの設定が効いているため
です。
• フリーワード検索なので、漢字が入力されることもあります。その場合の対応として mecab で漢字→かな変換をしています
さっそく試しみましょう
 と思ったのですが。。。
mysql> SELECT * FROM contents WHERE MATCH(kana) AGAINST("タケノコ");
+----+-----------+--------------+
| id | title | kana |
+----+-----------+--------------+
| 4 | 筍 | たけのこ |
| 5 | 数の子 | かずのこ |
+----+-----------+--------------+
2 rows in set (0.02 sec)
• MySQLのリファレンスマニュアルでブール全文検索を参照。
(英語はしんどいので、5.6のマニュアルと5.1の日本語のマニュアルを並べてみる。)
mysql> SELECT * FROM contents WHERE MATCH(kana) AGAINST("タケノコ" IN BOOLEAN MODE);
+----+-------+--------------+
| id | title | kana |
+----+-------+--------------+
| 4 | 筍 | たけのこ |
+----+-------+--------------+
2 rows in set (0.02 sec)
 trigram にしたら、「かずのこ」はヒットしなくなりましたが。 じゃ「きゅうり」と「ぎゅうにく」は?
感想
はじめて使った見たのですが、インストールからDBの構築までは、はまることなくできました。
また、MySQLのプラグインとして動作するものなので、だめだったら使わなければいいという
気持ちで使い始めました。
利用するシーンとしては、今まで like検索していたもの、(商品名、人名)で遅いといわれた場合に
導入してみるのもいいかなぁと思います。
ただ、実際のシステムは、ここでご紹介したような単純なものではなかったので、ノイズが多くて
こまりました。(検索結果として出てほしくないものがでたり、でてほしいものがでないなど)
日本語って難しいですね。
その時も、ここでは紹介していない パーサーをつかってみたり、Groongaのトークナイザを使ったり
して乗り切ることができました。(細かいところまで手がとどく)
参考サイト、ツール紹介
 ツール
• MySQL Workbench ( http://dev.mysql.com/downloads/tools/workbench/ )
何かと便利。ちょっと重いかな?
• A5:SQL Mk-2 ( http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/ )
ER図の作成だけではなく、ER図のリバース生成ができます。
今回は、旧システムのデータベースの構成を確認するために、大活躍しました。
 参考サイト
• gihyo.jp ( http://gihyo.jp/dev/clip/01/groonga/0001 )
2013年4月~2013年9月 連載記事がありました。
• Qiita ( http://qiita.com/tags/mroonga )

More Related Content

What's hot (19)

PDF
Windows環境でのMySQL
yoyamasaki
 
PDF
[D37]MySQLの真のイノベーションはこれだ!MySQL 5.7と「実験室」 by Ryusuke Kajiyama
Insight Technology, Inc.
 
PDF
MySQL5.7 GA の Multi-threaded slave
Takanori Sejima
 
PPTX
dimSTATから見るベンチマーク
hiroi10
 
PDF
What's New in MySQL 5.7 Security
Mikiya Okuno
 
PDF
What's New in MySQL 5.7 InnoDB
Mikiya Okuno
 
PDF
MySQLの冗長化 2013-01-24
Yoshihiko Matsuzaki
 
PPTX
MySQL Clusterを運用して10ヶ月間
hiroi10
 
PDF
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
Mikiya Okuno
 
PDF
MySQL最新情報 ※2015年9月5日「第1回 関西DB勉強会」での発表資料
yoyamasaki
 
PDF
MySQL 5.7とレプリケーションにおける改良
Shinya Sugiyama
 
PDF
MySQL最新情報  ※2016年12月
yoyamasaki
 
PPTX
MySQL clients
yoku0825
 
PDF
MySQL 4.0で9年動き続けたサーバを リプレイスしてバージョンアップした話
Takahiro Okumura
 
PDF
MySQL5.7とMariaDB10.1の性能比較(簡易)
hiroi10
 
PDF
20150920 中国地方db勉強会
yoyamasaki
 
PDF
MySQL 初めてのチューニング
Craft works
 
PDF
ゆるふわMySQLフェイルオーバー
Kimitoshi Takahashi
 
PDF
MySQL Cluster 解説 & MySQL Cluster 7.3 最新情報
yoyamasaki
 
Windows環境でのMySQL
yoyamasaki
 
[D37]MySQLの真のイノベーションはこれだ!MySQL 5.7と「実験室」 by Ryusuke Kajiyama
Insight Technology, Inc.
 
MySQL5.7 GA の Multi-threaded slave
Takanori Sejima
 
dimSTATから見るベンチマーク
hiroi10
 
What's New in MySQL 5.7 Security
Mikiya Okuno
 
What's New in MySQL 5.7 InnoDB
Mikiya Okuno
 
MySQLの冗長化 2013-01-24
Yoshihiko Matsuzaki
 
MySQL Clusterを運用して10ヶ月間
hiroi10
 
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
Mikiya Okuno
 
MySQL最新情報 ※2015年9月5日「第1回 関西DB勉強会」での発表資料
yoyamasaki
 
MySQL 5.7とレプリケーションにおける改良
Shinya Sugiyama
 
MySQL最新情報  ※2016年12月
yoyamasaki
 
MySQL clients
yoku0825
 
MySQL 4.0で9年動き続けたサーバを リプレイスしてバージョンアップした話
Takahiro Okumura
 
MySQL5.7とMariaDB10.1の性能比較(簡易)
hiroi10
 
20150920 中国地方db勉強会
yoyamasaki
 
MySQL 初めてのチューニング
Craft works
 
ゆるふわMySQLフェイルオーバー
Kimitoshi Takahashi
 
MySQL Cluster 解説 & MySQL Cluster 7.3 最新情報
yoyamasaki
 

Viewers also liked (16)

PPTX
MySQL対応全文検索システムMroonga(むるんが)
Hideshi Ogoshi
 
PDF
全文検索エンジンMroonga_エンジニア勉強会20140418
エンジニア勉強会 エスキュービズム
 
PDF
Ichii gree-crooz-20120126
Takashi Ichii
 
PDF
Groonga族2015
Kouhei Sutou
 
PDF
MySQLを通じた全文検索エンジンSenna/groongaの利用について
Tasuku Suenaga
 
PDF
全文検索エンジンgroongaの紹介@Solr勉強会
Tasuku Suenaga
 
PDF
Elastic searchとは_エンジニア勉強会20140212
エンジニア勉強会 エスキュービズム
 
PDF
Mroongaを選んだ理由と
ちょっと嬉しかった話
Terui Masashi
 
PDF
PostgreSQLでpg_bigmを使って日本語全文検索 (MySQLとPostgreSQLの日本語全文検索勉強会 発表資料)
NTT DATA OSS Professional Services
 
PDF
Elasticsearchベースの全文検索システムFess
Shinsuke Sugaya
 
PDF
いろいろ考えると日本語の全文検索もMySQLがいいね!
Kouhei Sutou
 
PPTX
みんな大好き“全文検索 on AWS”を試してみました!
宗 大栗
 
PDF
MySQLの全文検索に関するあれやこれや
yoku0825
 
PDF
MySQLの文字コード事情 2017版
Masahiro Tomita
 
PDF
Embulk, an open-source plugin-based parallel bulk data loader
Sadayuki Furuhashi
 
PDF
Railsチュートリアルの歩き方 (第4版)
Yohei Yasukawa
 
MySQL対応全文検索システムMroonga(むるんが)
Hideshi Ogoshi
 
全文検索エンジンMroonga_エンジニア勉強会20140418
エンジニア勉強会 エスキュービズム
 
Ichii gree-crooz-20120126
Takashi Ichii
 
Groonga族2015
Kouhei Sutou
 
MySQLを通じた全文検索エンジンSenna/groongaの利用について
Tasuku Suenaga
 
全文検索エンジンgroongaの紹介@Solr勉強会
Tasuku Suenaga
 
Elastic searchとは_エンジニア勉強会20140212
エンジニア勉強会 エスキュービズム
 
Mroongaを選んだ理由と
ちょっと嬉しかった話
Terui Masashi
 
PostgreSQLでpg_bigmを使って日本語全文検索 (MySQLとPostgreSQLの日本語全文検索勉強会 発表資料)
NTT DATA OSS Professional Services
 
Elasticsearchベースの全文検索システムFess
Shinsuke Sugaya
 
いろいろ考えると日本語の全文検索もMySQLがいいね!
Kouhei Sutou
 
みんな大好き“全文検索 on AWS”を試してみました!
宗 大栗
 
MySQLの全文検索に関するあれやこれや
yoku0825
 
MySQLの文字コード事情 2017版
Masahiro Tomita
 
Embulk, an open-source plugin-based parallel bulk data loader
Sadayuki Furuhashi
 
Railsチュートリアルの歩き方 (第4版)
Yohei Yasukawa
 
Ad

Similar to Mysql+Mroongaで全文検索 (14)

PPT
第20回 中国地方DB勉強会 in 岡山 MySQLレプリケーション
Ryusuke Kajiyama
 
PDF
Index shotgun on mysql5.6
yoku0825
 
PDF
5 古雷my sql源碼與資料庫規範
Ivan Tu
 
PDF
MySQLチューニング
yoku0825
 
PDF
ふくよかなモデル
yukaina
 
PDF
[D14] MySQL 5.6時代のパフォーマンスチューニング *db tech showcase 2013 Tokyo
yoyamasaki
 
PDF
MySQL勉強会 インデックス編.2013 08-02
CROOZ, inc.
 
PPTX
PostgreSQL使いのエンジニアから見たMySQL
toshihiro_kitagawa
 
PDF
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
Insight Technology, Inc.
 
PDF
第5回 cogbot勉強会!
貴志 上坂
 
PPTX
20141206 handson
Six Apart
 
PPTX
Amazon Athena で実現する データ分析の広がり
Amazon Web Services Japan
 
PDF
MySQL 開発最新動向
yoyamasaki
 
PPTX
Domino & REST
賢次 海老原
 
第20回 中国地方DB勉強会 in 岡山 MySQLレプリケーション
Ryusuke Kajiyama
 
Index shotgun on mysql5.6
yoku0825
 
5 古雷my sql源碼與資料庫規範
Ivan Tu
 
MySQLチューニング
yoku0825
 
ふくよかなモデル
yukaina
 
[D14] MySQL 5.6時代のパフォーマンスチューニング *db tech showcase 2013 Tokyo
yoyamasaki
 
MySQL勉強会 インデックス編.2013 08-02
CROOZ, inc.
 
PostgreSQL使いのエンジニアから見たMySQL
toshihiro_kitagawa
 
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
Insight Technology, Inc.
 
第5回 cogbot勉強会!
貴志 上坂
 
20141206 handson
Six Apart
 
Amazon Athena で実現する データ分析の広がり
Amazon Web Services Japan
 
MySQL 開発最新動向
yoyamasaki
 
Domino & REST
賢次 海老原
 
Ad

More from yoyamasaki (19)

PDF
MySQL 8.0で強化されたGIS機能のご紹介と周辺ツールとの連携について
yoyamasaki
 
PDF
MySQLドキュメントストアとCTE
yoyamasaki
 
PDF
MySQL 8.0で強化されたGIS機能のご紹介+α:「FOSS4G Tokai 2018 」での発表資料
yoyamasaki
 
PDF
MySQL最新情報
yoyamasaki
 
PDF
MySQL 8.0で強化されたGIS機能のご紹介:「FOSS4G 2018 Hokkaido」での発表資料
yoyamasaki
 
PDF
ついにリリース!! MySQL 8.0 最新情報
yoyamasaki
 
PDF
MySQLの公式GUIツール MySQL Workbench
yoyamasaki
 
PDF
DrupalとMySQL
yoyamasaki
 
PDF
MySQL Workbench 6.1 の紹介
yoyamasaki
 
PDF
MySQL製品概要
yoyamasaki
 
PDF
早くなったのか? MySQL5.5から5.6へのアップグレード事例
yoyamasaki
 
PDF
SQL+NoSQL!? それならMySQL Clusterでしょ。
yoyamasaki
 
PDF
MySQL最新動向と便利ツールMySQL Workbench
yoyamasaki
 
PDF
ドキュメントデータベースとして MySQLを使う!? ~MySQL JSON UDF~
yoyamasaki
 
PDF
MySQLをGUIで触ろう!! ~MySQL Workbenchのご紹介~
yoyamasaki
 
PDF
MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!
yoyamasaki
 
PDF
5分で作るMySQL Cluster環境
yoyamasaki
 
PDF
5分で作るMySQL Cluster環境
yoyamasaki
 
PDF
MySQLバックアップの基本
yoyamasaki
 
MySQL 8.0で強化されたGIS機能のご紹介と周辺ツールとの連携について
yoyamasaki
 
MySQLドキュメントストアとCTE
yoyamasaki
 
MySQL 8.0で強化されたGIS機能のご紹介+α:「FOSS4G Tokai 2018 」での発表資料
yoyamasaki
 
MySQL最新情報
yoyamasaki
 
MySQL 8.0で強化されたGIS機能のご紹介:「FOSS4G 2018 Hokkaido」での発表資料
yoyamasaki
 
ついにリリース!! MySQL 8.0 最新情報
yoyamasaki
 
MySQLの公式GUIツール MySQL Workbench
yoyamasaki
 
DrupalとMySQL
yoyamasaki
 
MySQL Workbench 6.1 の紹介
yoyamasaki
 
MySQL製品概要
yoyamasaki
 
早くなったのか? MySQL5.5から5.6へのアップグレード事例
yoyamasaki
 
SQL+NoSQL!? それならMySQL Clusterでしょ。
yoyamasaki
 
MySQL最新動向と便利ツールMySQL Workbench
yoyamasaki
 
ドキュメントデータベースとして MySQLを使う!? ~MySQL JSON UDF~
yoyamasaki
 
MySQLをGUIで触ろう!! ~MySQL Workbenchのご紹介~
yoyamasaki
 
MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!
yoyamasaki
 
5分で作るMySQL Cluster環境
yoyamasaki
 
5分で作るMySQL Cluster環境
yoyamasaki
 
MySQLバックアップの基本
yoyamasaki
 

Mysql+Mroongaで全文検索