2015-09-14 21 views
5

英語以外の単語を検出するためにEnglish dictionary(約275,000個のキーワード)の単語を検索する必要があります。現在使用しているクエリは実際には最適化されていません(wordsテーブルとtextsテーブルがあります)を実行するために10秒以上かかります: 複数のキーワードのテキストを検索

SELECT word FROM words WHERE 'The quick brown fox jumps over the lazy dog' LIKE CONCAT('%', word, '%');

hereからアイデアを得ました。

私は既にインデックスとしてwordフィールドを設定しており、テキストをデータベースに格納したり、クエリに直接入れる人の例を見てきました。

FULLTEXTを使用している人は300キロメートルの単語を持っていますが、私はFULLTEXTはうまくいかないと思っています。ロジック+brown +lazy -appleで検索すると良いでしょう。

Another example私は、IN (...)句と単語を結びつけることを見てきましたが、500mのキーワードを持つとクエリはちょっとひどく長くなります。

何をすべきか?

今テキストがtextフィールドとutf8_unicode_ciエンコーディングとInnoDB内varchar(50)などの単語として保存され、私はInnoDBはので、私はMyISAMテーブルや他のを使用することができます遅いです聞きました。 MySQL 5.6を使用していますが、5.6に更新することはできました。

+0

それは、MySQLで行う必要がありますか? – baao

+0

それは、PHPのための/ MySQLのWebサイト – Kenzier

答えて

2

LIKE比較は基本的にワイルドカード対応の等価性テストです。彼らは一般的なキーワード検索エンジンではありません。

WHERE foo LIKE '%a b%'はどこかのfooフィールドのリテラルテキストa bを含むすべてのレコードを見つけるだろう、彼らはa bは、単一のモノリシック「言葉」であり、その言葉は、その全体が検索され、個別にaまたはbのために見ていません。

あなたがLIKEを使用して、複数の「言葉」を検索したい場合は、迅速醜い、そして非常に非効率的な取得

WHERE foo LIKE '%a%' OR foo LIKE '%b%' OR etc... 

をしなければならない - %...検索では、インデックスを使用することはできません。

あなたは、あなたが数百万レコードに入る起動時にInnoDBはかなり遅い得ることができますはるかに簡単

WHERE MATCH(foo) AGAINST ('a b') 
+0

おかげでマルク、MATCH AGAINSTの問題は、私は本当に長いクエリのためになるだろう275K ORステートメントを必要とするだろうということです。 'word'はMySQLのフィールドで、' MATCH(text)AGAINST(word) 'を実行する必要があるのですか? – Kenzier

+0

番号。それは '(あなたのテキスト ')に対して'(field1、field2、....)一致します。そのテキストは1つの単語、またはbajillion単語になることができます。 –

+0

ああ、私は、パラメータが混在して参照してください。しかし、クエリはファイルに保存されている場合は50MBと非常に長く、すべてのキーワードを取得して連結する必要があります。それは問題だろうか? – Kenzier

0

を持つことができる場所、代わりにfulltext検索システムへの切り替えをしたほうが良いと思います。これは主に、表にアクセスするときに行をロックする方法によるものです。

私はFULLTEXT検索を行うためにMyIsamを使用します。おそらくのようなもの:

select word from words where match(text) against(word) 

私は効率のわからない、しかし、あなたが本当にあなたが話していたロジックを使用する必要はありませんが、私は考えていません。

EDIT:2番目のパラメータは、本当にすべての単語にする必要があるよう

私のコードは本当に、仕事に複数のパスを持っている必要があります。 SQL内にFORループを使用してデータを取り込むことができますが、そうするにはコードについて考える必要があります。おそらくカーソルやストアドプロシージャがそのトリックを行います。

私はあなたが全文検索を使用する必要があること、しかし、他の回答に同意します。

関連する問題