2011-09-15 13 views
1

のテキストを検索するこんにちは、私はこの事前に定義された言葉

word_id int(10) 
word varchar(30) 

のように見え、私はテキストを持っているデータベーステーブルを持って、私は何、このテキスト内の単語の一つは、そのテーブルで定義されているかを確認したいですこれを行う最もエレガントな方法は?

現在、すべての単語をデータベースに照会し、PHPを使用してテキスト全体の各単語を検索するので、データベースからすべての単語をPHPにダウンロードするのに時間がかかります。私のテキストに対して彼らの

+0

テキストを単語に分割し、各単語のDBを検索することを検討しましたか(現在のアプローチを逆にする)?はるかに効率的です。 – JohnFx

+0

既存の検索エンジンの使用はどうですか?いくつかのオープンソースオプションがあります。データベースを照会するコードを変更することができます。 – Dan

+0

何をしても、血圧の問題に注意してください。 (http://thedailywtf.com/Articles/The-Clbuttic-Mistake-.aspx) – JohnFx

答えて

3

あなたは、テキスト内の単語を抽出しようと、このようなSELECTクエリでそれらを置くことができます。

$words = array_unique(get_words_in_text(...)); 
$sql = "SELECT * FROM words WHERE word IN (".implode(", ", $words)).")"; 

があなたのSQLエンジンはこのステートメントを最適化していることもございます。いずれにせよ、データベース接続は、現在のアプローチよりも少なく利用されます。

一時的に別の単語表を作成し、その表にテキストのすべての単語を追加することもできます。次に、メインワードテーブルを使用してJOINを実行することができます。両方のテーブルのインデックスが正しく設定されていれば、と非常に速くなる可能性があります。

編集:この質問/回答は、一時テーブルの作成が確かに高速です(コメント参照):mysql select .. where .. in -> optimizingです。ただし、使用している具体的なデータベース、ワードテーブルのサイズ、テキストのサイズ、インデックスの構成などは確かに異なります。したがって、特定のシナリオで両方のアプローチを評価することをお勧めします。結果を報告してください。 :-)

0

アイデア:

// get words in file into array 
$file = file_get_contents('file.txt', FILE_IGNORE_NEW_LINES); 
$file_words = explode(" ", $file); 

// remove duplicate words, count elements in array after de-duplication 
$file_words = array_unique($file_words); 
$file_count = count($file_words); 

// create empty array in which to store hits 
$words_with_definition = array(); 

// check to see if each word exists in database 
for ($i=0; $i < $file_count; $i++) 
{ 
    // intentionally leaving out db connection, this is just a concept 
    // word should be at least three characters, change as needed 
    if (strlen($file_words[$i]) >= 3) 
    { 
     $sql = "SELECT word FROM your_table WHERE word='".$file_words[$i]."'"; 

     if (mysql_num_rows($sql) > 0) 
     { 
      // this is a hit, add it to $words_with_definition 
      array_push($words_with_definition, $file_words[$i]); 
     } 
    } 
} 

$のwords_with_definition配列であるものは何でもデータベース意気投合言葉になります。