2015-12-08 2 views
0

Наш поиск Lucene в нашей местности является непристойно медленным и полностью непригодным для использования - 30 секунд или более для поиска термина «собака» в ~ 6000 записей.Поиск Lucene неприлично медленный

Я совершенно не знаком с поиском и индексированием Lucene.

Я понимаю, что есть много способов оптимизировать что-то.

Я запустил профайлер и вставляю результаты здесь.

Здесь индекс кода контроллера, который съедает большую часть времени:

JO_Search_Lucene_Search_QueryParser::setDefaultEncoding('UTF-8'); 
$hits = $index->find($query); 

foreach ($hits as $hit) { 
    $ids[] = $hit->item_id; 
} 

$index->find($query) идет 4 реализаций. Я могу вставить эти несколько более длинные функции, если полезно, но только вставил закомментированные описания здесь в качестве стартера:

первых:

/** 
* Performs a query against the index and returns an array 
* of JO_Search_Lucene_Search_QueryHit objects. 
* Input is a string or JO_Search_Lucene_Search_Query. 
* 
* @param mixed $query 
* @return array JO_Search_Lucene_Search_QueryHit 
* @throws JO_Search_Lucene_Exception 
*/ 

второго:

/** 
* Performs a query against the index and returns an array 
* of JO_Search_Lucene_Search_QueryHit objects. 
* Input is a string or JO_Search_Lucene_Search_Query. 
* 
* @param mixed $query 
* @return array JO_Search_Lucene_Search_QueryHit 
* @throws JO_Search_Lucene_Exception 
*/ 

третий:

/** 
* Performs a query against the index and returns an array 
* of JO_Search_Lucene_Search_QueryHit objects. 
* Input is a string or JO_Search_Lucene_Search_Query. 
* 
* @param mixed $query 
* @return array JO_Search_Lucene_Search_QueryHit 
* @throws JO_Search_Lucene_Exception 
*/ 

четвертый:

/** 
* Performs a query against the index and returns an array 
* of JO_Search_Lucene_Search_QueryHit objects. 
* Input is a string or JO_Search_Lucene_Search_Query. 
* 
* @param mixed $query 
* @return array JO_Search_Lucene_Search_QueryHit 
* @throws JO_Search_Lucene_Exception 
*/ 

Ниже приведен снимок выполнения «время», «собственное время» и «звонки». Любые указания о том, где искать, оцениваются.

+0

Никто не ответит, если вы не разместите какой-либо код. См. [Mcve] (http://stackoverflow.com/help/mcve). –

+0

Спасибо @ltrzesniewski, я этого не знал. Я добавил код и комментарии, но есть так много кода, что я не хочу перегружать это. Если есть полезный конкретный код, я счастлив вставить больше. Tx. – ian

+0

Ты не совсем понял, что я имел в виду. Попробуйте извлечь отдельный пример, который отображает поведение, которое вы испытываете. Мы не можем отлаживать комментарии в конце концов :) –

ответ

0

В Zend Search Lucene, метод обижая _less с вашего следа делает strcmp (187,158 раз).

Эта конкретная цепочка вызовов считывается с диска. И 271 837 прочтений (_fread s) кажутся чрезмерными для здорового индекса с ~ 6000 предметов!

Скорее всего этот показатель никогда не был оптимизирован. Для вас это означает, что каждый раз, когда выдается commit, все переходные записи сохраняются на диске (как новый неизменный сегмент индекса Lucene). Теперь Lucene ищет две наборы индексных файлов. Скажем, вы выпустили 1000 коммитов с момента запуска, это означает, что Lucene ищет на диске 1000 наборов индексных файлов.

При оптимизации индекса все эти сегменты индекса объединяются в один сегмент. Есть раздел в Zend documentation об этом и более о Indexing Performance in the best practices section.

Вызов optimize может быть дорогостоящей операцией. Но важно периодически делать (ежедневная партия?), Чтобы сохранить количество сегментов индекса управляемым.

+0

Большое спасибо, Питер. Это дает мне возможность начать искать. Я очень ценю, что вы нашли время, чтобы проанализировать это. – ian