4

午後のチャップス、

LuceneのZendポートで170万行のテーブルにインデックスを付けようとしています。数千行の小さなテストでは完全に機能しましたが、行を数万行に増やすとすぐにタイムアウトになります。明らかに、phpがスクリプトの実行を許可する時間を増やすことはできますが、360秒で最大10,000行になるので、170万を実行するのに何秒かかるかを考えるのは嫌です。

また、スクリプトを数千回実行し、更新してから次の数千回実行しようとしましたが、これを実行すると、毎回インデックスがクリアされます。

アイデアはありますか?

ありがとう :)

4

3 に答える 3

3

Zend_Search_Luceneの開発者は友人であり、彼は本当に一生懸命働いているので、申し訳ありませんが、残念ながら、重要なサイズのデータ​​セットにインデックスを作成することは適切ではありません。

ApacheSolrを使用してインデックスを作成します。インデックスを作成するために、SolrがZendより300倍以上高速に実行されることをテストしました。

Zend_Search_Luceneを使用して、ApacheSolrで作成したインデックスに対してクエリを発行できます。

もちろん、PHPPECLSolr拡張機能を使用することもできます。これをお勧めします。

于 2010-04-17T00:40:59.193 に答える
0

そのテーブルから必要なフィールドのみを選択して、高速化してみてください。

これがcronジョブまたはワーカーとして実行するものである場合は、CLIから実行する必要があります。そのため、タイムアウトの変更が悪いことになる理由がわかりません。インデックスを作成する必要があるのは1回だけです。その後の新しいレコードまたはそれらの更新は、Luceneデータベースの小さな更新にすぎません。

于 2010-04-14T14:55:42.757 に答える
0

皆さんのためのいくつかの情報-私がコードスタイルを使用できるように、回答として投稿します。

$sql = "SELECT id, company, psearch FROM businesses";
$result = $db->query($sql);     // Run SQL

$feeds = array();

$x = 0;
while ( $record = $result->fetch_assoc() ) {
    $feeds[$x]['id'] = $record['id'];
    $feeds[$x]['company'] = $record['company'];
    $feeds[$x]['psearch'] = $record['psearch'];
    $x++;   
}

//grab each feed

foreach($feeds as $feed) {  
  $doc = new Zend_Search_Lucene_Document();  

    $doc->addField(Zend_Search_Lucene_Field::UnIndexed('id',  
    $feed["id"]));  

  $doc->addField(Zend_Search_Lucene_Field::Text('company',  
    $feed["company"]));  

    $doc->addField(Zend_Search_Lucene_Field::Text('psearch',  
    $feed["psearch"]));  

    $doc->addField(Zend_Search_Lucene_Field::UnIndexed('link',  
    'http://www.google.com'));  


  //echo "Adding: ". $feed["company"] ."-".$feed['pcode']."\n";  

  $index->addDocument($doc);  
}  



$index->commit();

(私は一時的なリンクとしてgoogle.comを使用しました)

その上で実行されているサーバーは、Ubuntu 8.10、3Gb RAM、およびDualPentium3.2GHzチップのローカルインストールです。

于 2010-04-15T10:12:25.600 に答える