Lucene / PHP ile büyük DB indeksleme

3 Cevap php

Öğleden sonra ahbap,

Lucene Zend portu ile endeks bir 1.7million satır tabloya çalışılıyor. Bir kaç bin satır küçük testlerinde onun mükemmel çalıştı, ama en kısa sürede denemek gibi ve binlerce birkaç on satır kadar, zaman aşımına. Açıkçası, ben php komut dosyası çalıştırmak için izin süresini artırmak, ancak 360 saniye olarak görmek beni ~ 10.000 satırları alır ki, ben 1.7million yapmak alırdım kaç saniye düşünmekten nefret ediyorum.

Ben de yenileme, komut bir kaç bin koşturttuğun çalıştı ve daha sonra bin, önümüzdeki birkaç çalıştırmak, ancak bunu yaparken endekslemek her zaman temizler ettik.

Herhangi bir fikir çocuklar?

Teşekkürler :)

3 Cevap

Zend_Search_Lucene geliştirici bir arkadaşım ve o gerçekten zor çalıştı, çünkü bunu söylemek için üzgünüm, ama ne yazık ki herhangi nontrivial boyutta veri kümeleri üzerinde dizin oluşturmak için uygun değildir.

Apache Solr dizinler oluşturmak için kullanın. I-tested Solr dizinleri oluşturmak için Zend daha fazla 300x hızlı çalışan olması.

Eğer Apache Solr ile oluşturulan dizin karşı sorguları vermek için Zend_Search_Lucene kullanabilirsiniz.

Tabii ki de ben tavsiye ederim PHP pecl Solr uzantısı kullanabilirsiniz.

Eğer bu tablo gerektiren yalnızca alanları seçerek hızlandırmak deneyin.

Bu bir cronjob olarak çalıştırmak için bir şey, ya da bir işçi ise, o CLI'den çalışıyor olması ve zaman aşımı değişen kötü bir şey olacağını neden olduğunu ben görmüyorum. Sen sadece bir kez indeksi oluşturmak zorunda. Onlara yeni kayıtlar veya güncellemeleri Lucene veritabanı sadece küçük güncellemeler sonra.

Hepiniz için bazı bilgi - Ben kod stilleri kullanabilirsiniz böylece bir cevap olarak gönderme.

$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();

(Ben bir geçici bağlantı olarak google.com kullandım)

Sunucu onun üzerinde çalışan Ubuntu 8.10, 3 Gb RAM ve Dual Pentium 3.2GHz çip yüklemek bir yerel.