2010-04-14 2 views
4

Дневного CHAPS,Индексирования большая БД с Lucene/РНР

Попытки индекса таблицы с 1.7million строки с портом Zend Lucene из. На небольших тестах в несколько тысяч строк она работала отлично, но как только я пытаюсь собрать строки до нескольких десятков тысяч, это истекает. Очевидно, я мог бы увеличить время, которое php позволяет сценарию запускать, но, увидев, что за 360 секунд получается ~ 10 000 строк, мне было бы неловко думать, сколько секунд потребуется, чтобы сделать 1.7 миллиона.

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

Любые идеи парней?

Спасибо :)

+0

Несколько 10 тысяч строк по-прежнему микроскопичны, если вы выбрали что-то действительно не так, отправьте свой SQL и, возможно, даже информацию о вашем сервере (cpu, ram). – TravisO

ответ

3

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

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

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

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

+0

Билл, спасибо за головы, я перешел к использованию Solr сейчас и индексировал 1,7 миллиона строк примерно за 8 минут; не заставляет вас чувствовать себя тепло внутри! Я столкнулся с одной проблемой, хотя ... http://stackoverflow.com/questions/2668279/using-solr-and-zends-lucene-port-together, но это был определенно правильный ход, спасибо! – Tom

0

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

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

+0

Спасибо за быстрый ответ Htbaa :) Я только что избавился от 2 полей, поэтому его теперь всего 3 (id, название компании и почтовый индекс). Я просто запускаю некоторые тесты, и я увижу, как это улучшает ситуацию. Разогнать время выполнения и позволить ему занять столько времени, сколько потребуется, хотя его боль для тестирования;) Мне нужно изучить обновление индекса Lucene, поскольку я не знал, что вы на самом деле могли? Еще раз спасибо! – Tom

+0

См. Http://framework.zend.com/manual/en/zend.search.lucene.index-creation.html для обновления документов и индекса. – Htbaa

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 в качестве ссылки TEMP)

Сервер работает на его является локальная установка в Ubuntu 8.10, 3Gb RAM и 3,2 ГГц чип Dual Pentium.

+1

Почему вы занимаетесь двойным циклом? Похоже, вы могли обойтись с помощью одного цикла. –

+0

Я хотел бы поделиться с вами некоторыми советами по производительности: 1- вы попадаете в 2 цикла, каждый из которых имеет 1,7 миллиона записей ......... 2- Zend_Db_Table_Abstract :: setDefaultMetadataCache ($ cache); что значительно ускорит ваш запрос – tawfekov