下午的小伙子,
尝试使用Lucene的Zend端口索引170万行表。在几千行的小测试中,它完美地工作,但是一旦我尝试将行数增加到几万,它就会超时。显然,我可以增加php允许脚本运行的时间,但是看到360秒会让我看到大约10,000行,我不想想要耗费170万的时间需要多少秒。
我也尝试让脚本运行几千,刷新,然后运行接下来的几千个,但这样做每次都会清除索引。
任何想法的人?
谢谢:)
答案 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芯片。