全文検索について簡単に調べたメモ

さっくり調べる。

概要を知る

読む

メモ

  • 形態素解析:
    • 辞書品質により検索落ちも
  • N-Gram:
    • ノイズ: 京都 -> 東京都庁
    • インデックスサイズ肥大化
  • 評価指標
    • recall (再現率): 検索漏れの少なさ
    • precision (適合率): 検索ノイズの少なさ
    • recall と precision はトレードオフ

日本語縛りなら形態素解析 ?

  • Ngram の利点は言語選ばず適用可能なこと
  • 但し原理的に精度が形態素解析に及ばない
    • 検索抜けを回避したい等の明確な理由により検討余地あり
  • 日本語は特殊処理を要する傾向がある

形態素解析の欠点

  • 処理時間
  • 辞書の分割単位と検索漏れ
    • 辞書:マカデミアナッツ クエリ:ナッツ でノーヒット

ソリューション

groonga
Sphinx

(抜粋&並び替え)
..Sphinx was specially designed to integrate well with SQL databases .. built-in data sources support fetching data either via direct connection to MySQL or PostgreSQL, or using XML pipe
..supports MySQL natively (MyISAM and InnoDB tables are both supported)
..distributed under GPL version 2. Commercial license is also available for embedded use.

http://www.sphinxsearch.com/about.html


疑問


2008 年の記事

Sphinx はインストールや維持管理が容易であり、また非常に高機能です。しかも Sphinx の最近のリリースでは、ネイティブの MySQL エンジンを提供しており、Sphinx デーモンを別途実行する必要がありません。
Sphinx は時間と共に改善が続けられており、ショッピング・サイトやブログ、その他数多くのアプリケーションに理想的なものになっています。Sphinx のサイトによれば、1 つのアプリケーションが今や 7 億の文書、または約 1.2 テラバイトのデータを索引付けすることができます。私は迷わず Sphinx をお薦めします。
しかし Sphinx は、アプリケーションやサイトの人気が高まり、利用数が増えるにつれて求められる、あるいは提供が必要となる、いくつかの機能をまだサポートしていません。
特に、Sphinx はまだ索引を自動的に複製したり配布したりする機能がないため、Sphinx のデーモンが単一障害点になっています。
(この回避策として、数台のマシンが同じデータベースに索引を付けるようにし、そうしたシステムをクラスター化する方法があります。)
Sphinx は (Google がキャッシュしたページを表示する際に強調するように) 検索結果を強調表示することはなく、最近の検索結果を保持したりキャッシュしたりすることはなく、また正規表現 (regex) も日付に基づく操作もサポートしていません。

http://www.ibm.com/developerworks/jp/opensource/library/os-php-apachesolr


実践 MySQL パフォーマンス第二版 付録C

C.1 概要:一般的なSphinx検索
C.2 Sphinxを使用する理由
C.2.1 効率的でスケーラブルな全文検索
C.2.2 WHERE句の効率的な適用
C.2.3 結果を上位のものから順に検索する
C.2.4 GROUP BYクエリの最適化
C.2.5 結果セットの並行生成
C.2.6 スケーリング
C.2.7 シャードデータの集計
C.3 アーキテクチャの概要
C.3.1 インストールの概要
C.3.2 パーティションの一般的な用途
C.4 特別な機能
C.4.1 フレーズ近傍ランキング
C.4.2 属性のサポート
C.4.3 フィルタリング
C.4.4 SphinxSEストレージエンジン
C.4.5 高度なパフォーマンス制御
C.5 実装の実例
C.5.1 Mininova.orgの全文検索
C.5.2 BoardReader.comでの全文検索
C.5.3 Sahibinden.comでの選択の最適化
C.5.4 BoardReader.comでのGROUP BYの最適化
C.5.5 Grouply.comでのシャードJOINクエリの最適化
C.6 まとめ

MySQL 周りのお話

MySQL 5.0
Tritonn/Senna
住商情報システム未来検索ブラジルによるサポート提供
• 最も実績がある
MySQL 5.1以降
Sphinx
http://www.sphinxsearch.com/
MySQLのストレージエンジンとして動作し、UTF-8であればBi-gram方式に より、日本語の全文検索が可能
• 分散検索エンジン。非常に高速
• Craigslistなど、海外の大規模サイトでの実績が多数
• 利用方法がやや特殊
– FulltextParserPlugin
http://mysqlftppc.wiki.sourceforge.net/Home-j
– mroonga/groonga
Sennaの後継にあたる。現在開発中

http://www.mysql.gr.jp/frame/modules/bwiki/index.php?plugin=attach&refer=matsunobu&openfile=MySQL_perf.pdf

MongoDB の検索ストラテジちょこっと

  • Business Insider は LAMoP 構成
  • SimpleMongoPhp
  • memcached でキャッシングレイヤ
    • 単純なもの、記事単体はキャッシュ対象とせず
    • mongo 自体が effective caching layer である
    • we do still do some caching on more complex queries