2009-03-04 18 views
4

制限事項や落書きや反パターンや落とし穴は何ですか?Mysqlフルテキストインデックスの制限?

これは非常に魅力的だと思われます。明らかに、ほとんど仕事がない検索エンジンを作成できます。しかし、それはその問題なしにすることはできません...

あなたの経験は何ですか?

答えて

4

私の意見では、最大の欠点は、MySQL全文索引付けがMyISAMテーブルに限定されていることです。 InnoDBのテーブルには、多くの重要な機能が欠けています。トランザクション。それはその問題もなくすることはできません

+4

これを回避するには、スレーブマシンを作成します。スレーブのテーブルタイプはマスターに一致する必要はありません。つまり、innodbマスターがフルテキスト検索を行うmyisamスレーブを持つことができます。 http://dev.mysql.com/doc/refman/5.1/en/replication-solutions-diffengines.html – txyoji

+0

ヒントのおかげで、txyoji、私はそれを認識していませんでした。心に留めておくこともできます。 –

+7

MySQL 5.6では、innodbテーブルのフルテキストサポートが追加されました! –

4

大きなテーブルの場合、MySQL設定ファイルでバッファサイズとキャッシュ制限を増やす必要があります。

また、検索で使用するMATCH()列は、インデックス内の列と同じである必要があります。

14

...

それは確かではありません!

ブロックされた単語だけで構成される検索語は、自動的に失敗します。最小/最大の長さ制限やストップワードファイルのために単語をブロックすることができます。

デフォルトのストップワードファイルがあまりにも積極的であることが判明したため、多くの有効な検索ができませんでした。また、デフォルトの最小長さ4は、人々が検索したいかもしれない頭字語に対して非常に頻繁に蹴られていました。私はft_min_word_lenを3に減らし、ストップリストを完全に削除しました(ft_stopword_file = '')。 Doc:http://dev.mysql.com/doc/refman/5.1/en/fulltext-fine-tuning.html

また、検索クエリに<の4文字の単語しか含まれていないかどうか調べて、その場合はLIKE検索に戻ることができます。アプリケーションレベルでストップリストの周りを回るような簡単な方法はありません。

「単語の文字」の選択があなたのニーズを満たしていない可能性があり、変更するのは難しいです。たとえば、「Terry」を検索すると「Terry's」と一致しません。一般的に、どんな種類のステミングもサポートされていないので、「ビスケット」は「ビスケット」と一致しません。

最後に、前述のように、InnoDBのサポートはありません。この時代には、すべてのデータをMyISAMテーブルに入れることは望ましくありません。

もしあなたが余裕を持っているなら、InnoDBテーブルにデータの主な標準バージョンを入れてから、フリーテキスト・コンテンツのコピーを含む別のMyISAMテーブルを作成するだけですsearchbaitとして。変更の両方のテーブルを更新する必要がありますが、MyISAMテーブルの整合性が失われた場合、実際のライブデータをバウンスしてアプリケーションエラーを取得するのではなく、少なくとも関連する行を検索する能力が失われます。

余裕を持っていれば、上記の制限のいくつかを回避するために、検索ベイトとクエリワードに独自のテキスト処理を実装することができます。たとえば、単語文字にしたい文字をエスケープしたり、単語文字にしたくない文字を削除したり、簡単な英語のステミングを手動で行うことができます。