下午的小伙伴们,
试图用 Lucene 的 Zend 端口索引一个 170 万行的表。在几千行的小型测试中,它工作得很好,但是一旦我尝试将行增加到几万行,它就会超时。显然,我可以增加 php 允许脚本运行的时间,但是看到 360 秒可以让我获得约 10,000 行,我不想考虑执行 170 万行需要多少秒。
我也尝试过让脚本运行几千次,刷新,然后运行接下来的几千次,但是这样做每次都会清除索引。
有什么想法吗?
谢谢 :)
下午的小伙伴们,
试图用 Lucene 的 Zend 端口索引一个 170 万行的表。在几千行的小型测试中,它工作得很好,但是一旦我尝试将行增加到几万行,它就会超时。显然,我可以增加 php 允许脚本运行的时间,但是看到 360 秒可以让我获得约 10,000 行,我不想考虑执行 170 万行需要多少秒。
我也尝试过让脚本运行几千次,刷新,然后运行接下来的几千次,但是这样做每次都会清除索引。
有什么想法吗?
谢谢 :)
说起来很抱歉,因为 Zend_Search_Lucene 的开发者是朋友,他已经很努力了,但不幸的是它不适合在任何非平凡大小的数据集上创建索引。
使用Apache Solr创建索引。我已经测试过Solr 在创建索引方面的运行速度比 Zend 快 300 倍以上。
您可以使用 Zend_Search_Lucene 针对您使用 Apache Solr 创建的索引发出查询。
当然,您也可以使用我推荐的 PHP PECL Solr扩展。
为大家提供一些信息 - 作为答案发布,以便我可以使用代码样式。
$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 芯片。
尝试通过仅从该表中选择您需要的字段来加快速度。
如果这是作为 cronjob 或工作程序运行的东西,那么它必须从 CLI 运行,为此我不明白为什么更改超时会是一件坏事。您只需构建一次索引。之后,新记录或对它们的更新只是对 Lucene 数据库的小更新。