4

下午的小伙伴们,

试图用 Lucene 的 Zend 端口索引一个 170 万行的表。在几千行的小型测试中,它工作得很好,但是一旦我尝试将行增加到几万行,它就会超时。显然,我可以增加 php 允许脚本运行的时间,但是看到 360 秒可以让我获得约 10,000 行,我不想考虑执行 170 万行需要多少秒。

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

有什么想法吗?

谢谢 :)

4

3 回答 3

3

说起来很抱歉,因为 Zend_Search_Lucene 的开发者是朋友,他已经很努力了,但不幸的是它不适合在任何非平凡大小的数据集上创建索引。

使用Apache Solr创建索引。我已经测试过Solr 在创建索引方面的运行速度比 Zend 快 300 倍以上。

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

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

于 2010-04-17T00:40:59.193 回答
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 和双奔腾 3.2GHz 芯片。

于 2010-04-15T10:12:25.600 回答
0

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

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

于 2010-04-14T14:55:42.757 回答