#はじめに
Rails4.2 + MySQL5.6 ので動くアプリに対し、全文検索(日本語)がしたく、全文検索とは何かわかっていない状態から調べたときのまとめです。
MySQLを使う方法と、別の全文検索サーバーを用いる方法について調べました。
#全文検索とは
複数文書にまたがって、文書に含まれる全文を対象とした検索
https://ja.wikipedia.org/wiki/全文検索
##主なやり方
文書にインデックスをつけて、インデックスを引くことで高速に検索
インデックスの辞書を作るために、文章からインデックス(索引)を抽出する必要がある
###英語の索引文字抽出
- わかち書き(スペース区切り)であるため、スペースで区切る
###日本語の索引文字抽出
- 形態要素解析
- N-Gram
- "おはよう" であれば "おは はよ よう" のように分解する
- RubyでN-Gram
http://d.hatena.ne.jp/lettas0726/20120210/1328873031
#MySQLを使う
##MySQLに日本語全文検索対応のストレージエンジンを使う
##MySQLの Fulltext indexを使う
-
MySQL 5.7を使う
- 5.7から Fulltext indexが日本語対応
-
MySQL 5.6を使う
- 事前に形態要素解析またはN-Gramにより分割しておき、Fulltext indexを使う
http://www.tatamilab.jp/rnd/archives/000389.html#c - RailsとMysql5.6で全文検索
http://ria10.hatenablog.com/entry/20140107/1389071672
http://qiita.com/nabeen/items/275e46d318103ff737b0
http://blog.wackwack.net/entry/2016/03/21/221821
- 事前に形態要素解析またはN-Gramにより分割しておき、Fulltext indexを使う
#全文検索サーバーを使う
下記のような選択肢がある
- Elasticsearch
- Elasticsearchを自分でたてる
- Elasticsearch service (AWS)
- Elastic cloud (Elasticsearchを作っている会社のサービス)
- Amazon Cloudsearch
- Solr
- Groonga
- Sphinx
全文検索エンジンの比較
http://mojavy.com/blog/2014/02/10/search-engine-comparison/
Amazon cloud searchから Elasticsearchに乗り換えた理由
http://blog.otakumode.com/2016/07/15/replace-cloudsearch-to-elasticsearch/
##Elasticsearchの導入
既存のRailsアプリにElasticsearchを導入してみる
http://qiita.com/moriyaman/items/373107a3870c33229bac
Wantedlyの例
http://engineer.wantedly.com/2014/02/25/elasticsearch-at-wantedly-1.html
FRILの例
http://mosowave.hatenablog.com/entry/2015/12/07/000000
##MySQLとElasticserachの同期
-
logstashでELBのログを2週間分だけAmazon Elasticsearch Serviceに取り込む
http://dev.classmethod.jp/cloud/aws/import-elb-logs-using-logstash/ -
ElasticsearchのRiverプラグインを使う
http://dotnsf.blog.jp/archives/1005246681.html
#結論
まずはMySQLのFulltext indexで様子をみて、耐えられなければ、またより柔軟な検索を行いたければ別の全文検索サーバーをたてる。全文検索サーバーではElasticsearchがはやりのよう。