使用Lucene / PHP索引大型数据库

时间:2010-04-14 14:51:32

标签: php mysql lucene zend-search-lucene

下午的小伙子,

尝试使用Lucene的Zend端口索引170万行表。在几千行的小测试中,它完美地工作,但是一旦我尝试将行数增加到几万,它就会超时。显然,我可以增加php允许脚本运行的时间,但是看到360秒会让我看到大约10,000行,我不想想要耗费170万的时间需要多少秒。

我也尝试让脚本运行几千,刷新,然后运行接下来的几千个,但这样做每次都会清除索引。

任何想法的人?

谢谢:)

3 个答案:

答案 0 :(得分:3)

我很遗憾地说,因为Zend_Search_Lucene的开发人员是朋友而且他的工作非常努力,但不幸的是,它不适合在任何非常重要的数据集上创建索引。

使用Apache Solr创建索引。我有tested,Solr的运行速度比Zend快300倍,用于创建索引。

您可以使用Zend_Search_Lucene针对您使用Apache Solr创建的索引发出查询。

当然你也可以使用我推荐的PHP PECL Solr扩展名。

答案 1 :(得分:0)

尝试通过仅选择该表中所需的字段来加快速度。

如果这是作为cronjob或worker运行的东西,那么它必须从CLI运行,为此我不明白为什么更改超时会是一件坏事。您只需要构建一次索引。之后,对它们的新记录或更新只是对Lucene数据库的小更新。

答案 2 :(得分: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和Dual Pentium 3.2GHz芯片。