InnoDBによる全文検索


93

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

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

問題は... InnoDBにはフルテキスト検索機能が組み込まれていません。

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

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


回答:


50

MyISAMフルテキストが不適切なオプションであることを保証できます。MyISAMテーブルの一般的なさまざまな問題を別にしても、フルテキストのものがレールから外れ、定期的に破損してMySQLがクラッシュするのを見てきました。

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

LuceneとSphinxは適切なオプションです。Xapianも同様で、軽量で優れています。Luceneルートを使用する場合、Javaと格闘したくない場合でも、Cluceneがより良いとは限りませんが、私はどちらの長所と短所についても議論する資格がありません。


7
Solr(Luceneに基づく)は非常にスケールが大きく、非常に強力で柔軟です。私たちはSolr(具体的にはSolid版のLucidWorks)を採用しており、これは大きな勝利でした。Sphinxにもいくつかの深刻な約束がありますが、最終的にはデータ型の欠如が、少なくとも私たちのアプリケーションにとって厄介なものになる可能性があります。Sphinxは非常に高速で、ニーズに合っているかどうかも確かな選択です。
Cody Caughlan

お二人、ありがとうございました。素晴らしい反応。私はSolrのドキュメントをざっと見てきましたが、これは素晴らしい解決策のようです。それはかなりの数の巨大なウェブサイトにもパワーを与えていると思います。Solrがチケットだと思います。みんなありがとう。また、あなたのMyISAMの頭痛、イアンを知るのは良いことです...それらは将来心に留めておくのに良いでしょう。他のプロジェクトでは、フルテキスト機能を使用しようとするのをやめます。
brianreavis 2009

11
何がイアンに「Cluceneが良くなると思い込まないで」と言ったのかと思っていましたか?cluceneコアチームの1つとして、私はそれほど客観的ではないかもしれませんが、Javaライブラリの最適化されたC ++ポートは、そのパフォーマンスを大幅に向上させるようです。私は、誰かが不名誉な製品を少なくとも一目見ずにそのようなコメントを投稿しないことをお勧めします。
synhershko

4
MyISAMを非難するときは、より具体的になる必要があります。 「オフレール」は非常にあいまいであり、おそらく修正されて以来、使用していたビルドの単一のバグが原因である可能性があります。
bobobobo 2010

6
しかし、サーバーにソフトウェアをインストールするオプションがない場合はどうなりますか?この場合、どのような選択肢がありますか?
acme

56

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

https://dev.mysql.com/doc/refman/5.6/en/innodb-fulltext-index.htmlでのジューシーな詳細の多く。

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


1
記事のリンクは403禁止
マルコデマイオ2013

11

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

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

考えられる別の解決策として、 Googleカスタム検索をご紹介します。WebアプリケーションにSEOを適用できる場合は、インデックス作成と検索機能をGoogleにアウトソーシングし、Google検索テキストフィールドをサイトに埋め込みます。それはあなたのサイトを検索可能にする最も経済的でスケーラブルな方法かもしれません。


ありがとう、ビル。ええ、Sphinxのドキュメントでは、インデックスの更新を処理する方法について少し迷っていました。確認してもらってよかった。そのようなシステムはおそらく私にとって悪夢に変わるでしょう。Googleカスタム検索に関しては、それはオプションです。ただし、それに関する私の主な問題は、非リアルタイムインデックスとカスタマイズの欠如です。結果をスタイリングし、追加のデータを取得することは、私にとってかなり重要です。ただし、スフィンクスの情報は知っておくと役に立ちます。
brianreavis 2009

3

たぶん、MySQLのFTをそれほど早く却下すべきではありません。 Craigslistが使用していました

MySQLの速度と全文検索により、craigslistはユーザーにサービスを提供できるようになりました。craigslistはMySQLを使用して、毎月約5,000万回の検索を1秒あたり最大60回の検索の速度で提供しています。」

編集する

以下でコメントするように、Craigslistは2009年の初めにSphinxに切り替えたようです。


私がリンクした記事はSphinxについて言及しておらず、NikはCraigslistがSphinxを使用しているとの情報源を一切引用していません
bobobobo

ケーススタディのPDFは、2004年からは1か月あたり5000万件の検索があったように見えます。Sphinxページには1 あたり5,000万回の検索が記載されています。これはおそらく、専用の検索ソリューションに切り替えた理由を説明しています。
HalilÖzgür、2011

1

あなたが指摘するように、Sphinxはこのようなものに非常に適しています。すべての作業は構成ファイルにあります。文字列が含まれているテーブルに固有の整数IDキーがあることを確認してください。問題はありません。



0

Sphinxを見てください。試してみる価値があります。索引付けは非常に高速で、分散されています。このWebセミナー(http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown)をご覧ください。検索について話し、いくつかのきちんとしたベンチマークがあります。あなたはそれが役に立つかもしれません。



0

MySQL / MariaDBの古いバージョン(CentOSユーザーなど)で立ち往生しているInnoDBがフルテキスト検索をサポートしていない場合、InnoDBテーブルを使用するときの私の解決策は、検索したいものに対して個別のMyISAMテーブルを作成することでした。

たとえば、私のメインのInnoDBテーブルにはproducts、さまざまなキーと参照整合性がありました。私は、と呼ばれる簡単なMyISAMテーブルを作成product_search二つのフィールドを含むが、product_idそしてproduct_nameどこ後者は次のように設定されたFULLTEXT指標。どちらのフィールドも、メインproductテーブルの内容のコピーです。

次に、フルテキストを使用してMyISAMテーブルを検索し、InnoDBテーブルに内部結合を戻します。

MyISAMテーブルの内容は、トリガーまたはアプリケーションのモデルを介して最新に保つことができます。

フルテキストを必要とする複数のテーブルがある場合、これはお勧めしませんが、単一のテーブルの場合は、アップグレードできるまでは十分な回避策のようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.