Индексирование больших БД с помощью Lucene / PHP - PullRequest
4 голосов
/ 14 апреля 2010

Дневные парни,

Попытка индексировать таблицу строк на 1,7 миллиона с помощью Zend-порта Lucene. На небольших тестах, состоящих из нескольких тысяч строк, он работал отлично, но как только я пытаюсь поднять количество строк до нескольких десятков тысяч, время истекает. Очевидно, я мог бы увеличить время, которое php позволяет запускать сценарий, но, поскольку 360 секунд дают мне ~ 10000 строк, я бы не хотел думать, сколько секунд потребуется для выполнения 1.7 миллионов.

Я также пытался заставить скрипт запускать несколько тысяч, обновлять, а затем запускать следующие несколько тысяч, но при этом каждый раз очищается индекс.

Есть идеи, ребята?

Спасибо:)

Ответы [ 3 ]

3 голосов
/ 17 апреля 2010

Мне очень жаль это говорить, потому что разработчик Zend_Search_Lucene - друг, и он очень усердно работал над этим, но, к сожалению, он не подходит для создания индексов для наборов данных любого нетривиального размера.

Используйте Apache Solr для создания индексов. У меня проверено , что Solr работает в 300 раз быстрее, чем Zend для создания индексов.

Вы можете использовать Zend_Search_Lucene для выдачи запросов к индексу, который вы создали с помощью Apache Solr.

Конечно, вы также можете использовать расширение PHP PECL Solr , которое я бы порекомендовал.

0 голосов
/ 15 апреля 2010

Некоторая информация для вас - размещение в качестве ответа, чтобы я мог использовать стили кода.

$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,2 ГГц.

0 голосов
/ 14 апреля 2010

Попробуйте ускорить его, выбрав только те поля, которые вам нужны из этой таблицы.

Если это что-то, запускаемое как cronjob или рабочий, то оно должно быть запущено из CLI, и для этого я не понимаю, почему изменение времени ожидания было бы плохо Вы должны построить индекс только один раз. После этого новые записи или обновления к ним являются лишь небольшими обновлениями вашей базы данных Lucene.

...