【问题标题】:Indexing large DB's with Lucene/PHP使用 Lucene/PHP 索引大型数据库
【发布时间】:2010-04-14 14:51:32
【问题描述】:

下午的小伙子们,

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

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

各位有什么想法吗?

谢谢:)

【问题讨论】:

  • 几万行仍然是微不足道的,如果您超时,确实发生了错误,请发布您的 SQL,甚至可能是您的服务器信息(cpu,ram)。

标签: php mysql lucene zend-search-lucene


【解决方案1】:

我很抱歉,因为 Zend_Search_Lucene 的开发者是一个朋友,他真的很努力,但不幸的是它不适合在任何不平凡的数据集上创建索引。

使用Apache Solr 创建索引。我有tested,Solr 在创建索引方面的运行速度比 Zend 快 300 倍以上。

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

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

【讨论】:

  • Bill,感谢您的提醒,我现在已经开始使用 Solr,并且在大约 8 分钟内获得了 170 万行索引;那是不是让你内心感到温暖!虽然我遇到了一个问题...stackoverflow.com/questions/2668279/…,但这绝对是正确的举动,谢谢!
【解决方案2】:

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

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

【讨论】:

  • 感谢您的快速回复 Htbaa :) 我刚刚删除了 2 个字段,所以现在只有 3 个(id、公司名称和邮政编码)。我只是在运行一些测试,我会看看它是如何改进的。增加运行时间并让它尽可能长是一种选择,尽管它对测试很痛苦;)我需要考虑更新 Lucene 索引,因为我不知道你实际上可以吗?再次感谢!
  • 请参阅framework.zend.com/manual/en/… 以更新文档和索引。
【解决方案3】:

为大家提供一些信息 - 作为答案发布,以便我可以使用代码样式。

$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 芯片。

【讨论】:

  • 为什么要双循环?看起来你可以用一个循环就好了。
  • 我想与您分享一些性能提示:1-您进入 2 个循环,每个循环都有 170 万条记录............ 2- Zend_Db_Table_Abstract:: setDefaultMetadataCache($cache);这将显着加快您的查询速度
猜你喜欢
  • 2011-07-03
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
相关资源
最近更新 更多