web-dev-qa-db-ja.com

InnoDBを使用した全文検索

私は大量のWebアプリケーションを開発しています。その一部は、20M行以上にスムーズに成長する必要があるディスカッション投稿のMySQLデータベースです。

私はもともとテーブルにMyISAMを使用することを計画していました(組み込みの 全文検索機能 )が、テーブル全体の考えはテーブル全体単一の書き込み操作のためにロックされると、シャッターが切れます。行レベルのロックは非常に理にかなっています(巨大なテーブルを処理するときのInnoDBのその他の速度の利点は言うまでもありません)。ですから、この理由から、私はInnoDBを使うことにかなり決心しています。

問題は... InnoDBには全文検索機能が組み込まれていないことです。

サードパーティの検索システムを使用する必要がありますか? Lucene(c ++) / Sphinx ?あなたのデータベース忍者に何か提案/ガイダンスがありますか? LinkedInの zoie (Luceneに基づく)は現時点で最良の選択肢のようです...リアルタイム機能を中心に構築されている(これは私のアプリケーションにとって非常に重要です。)私はまだ洞察なしにコミットすることを少しためらっています...

(参考:PHPを使用してフロントエンドにサービスを提供する、ハイメモリリグを使用してEC2にアクセスします)

93
brianreavis

私はMyISAM全文が悪いオプションであることを保証できます-MyISAMテーブルの一般的なさまざまな問題を別にしても、全文のものがRails定期的に。

ここでは、専用の検索エンジンが間違いなく最も柔軟なオプションになります。投稿データをMySQL/innodbに保存してから、テキストを検索エンジンにエクスポートします。定期的なフルインデックスビルド/パブリッシュを非常に簡単に設定でき、必要性を感じて時間を使いたい場合は、リアルタイムのインデックス更新を追加できます。

LuceneとSphinxは、 Xapian のように良いオプションです。これは、すてきで軽量です。 Luceneのルートに行く場合、Javaと格闘したくない場合でも、Cluceneの方が良いと思い込まないでください。

50
Ian Wilkes

MyISAMの一般的な段階的廃止に加えて、 InnoDB全文検索(FTS)はMySQL 5.6.4リリースでようやく利用可能になりました。

http://dev.mysql.com/doc/refman/5.6/en/innodb-table-and-index.html#innodb-fulltext-index から:

これらのインデックスは、InnoDBテーブル全体として物理的に表され、CREATE INDEXステートメントのFULLTEXT句、SELECTステートメントのMATCH()... AGAINST構文、およびOPTIMIZE TABLEステートメントなどのSQLキーワードによって処理されます。

他のエンジンにはさまざまな機能がありますが、これはInnoDBであるため、ネイティブ(アップグレードパスがあることを意味します)であり、価値のあるオプションになっています。

56
Jeremy Smyth

1時間を費やして、SphinxとLuceneのインストールとテストドライブを行う必要があります。データの更新に関して、どちらかがニーズを満たしているかどうかを確認します。

Sphinxで私を失望させたものの1つは、インクリメンタルインサートをあまりサポートしていないことです。つまり、挿入後にインデックスを再作成するのは非常にコストがかかるため、推奨される解決策は、データを古い不変の行と新しい揮発性の行に分割することです。そのため、アプリで行うすべての検索は、古い行の大きいインデックスと最近の行の小さいインデックスの2回検索する必要があります。それが使用パターンと統合されない場合、このSphinxは良いソリューションではありません(少なくとも現在の実装ではそうではありません)。

あなたが検討できる別の可能な解決策を指摘したいと思います: Googleカスタム検索 。 WebアプリケーションにSEOを適用できる場合は、インデックス作成と検索機能をGoogleに外注し、Google検索テキストフィールドをサイトに埋め込みます。サイトを検索可能にする最も経済的でスケーラブルな方法かもしれません。

11
Bill Karwin

おそらく、MySQLのFTをそれほど迅速に却下しないでください。 Craigslistを使用して使用

MySQLの速度とフルテキスト検索により、craigslistはユーザーにサービスを提供できるようになりました。

編集する

以下にコメントするように、Craigslistは Sphinxに切り替えられた が2009年の早い時期にあるようです。

3
bobobobo

あなたが指摘するように、スフィンクスはこのようなものにとって非常に素晴らしいです。すべての作業は構成ファイルにあります。テーブルに文字列が含まれているものには、一意の整数idキーが含まれていることを確認してください。

1
Gregg Lind

他のすべてが失敗した場合は、常に soundex_match があります。

0
user1612250

Sphinxを見てください。試してみる価値はあります。インデックス作成は非常に高速で、分散されています。これ(http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown)webminarをご覧ください。検索について説明し、いくつかのきちんとしたベンチマークがあります。役に立つかもしれません。

0
Muhammad

これを試して

ROUND((LENGTH(text) - LENGTH(REPLACE(text, 'serchtext', ''))) / LENGTH('serchtext'),0)!=0
0
Rakesh Ojha