Lucene的搜索速度非常慢

时间:2015-12-08 02:14:58

标签: php performance search indexing lucene

我们网站的Lucene搜索速度非常缓慢且完全无法使用 - 30秒或更长时间搜索“#34; dog"在约6,000条记录中。

我对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
 */

下面是执行的快照"时间","自己的时间"和#34;电话"。任何关于在哪里看的指导都表示赞赏。

1 个答案:

答案 0 :(得分:0)

Zend Search Lucene中,您跟踪中的违规方法_less正在执行strcmp(187,158次)。

此特定调用链从磁盘读取。 271,837次读取(_fread s)似乎对于包含~6000项的健康指数而言过度了!

此索引很可能从未进行优化。这对您来说意味着,每次发出commit时,所有瞬态写入都会持久保存到磁盘(作为新的,不可变的Lucene索引段)。现在Lucene正在搜索两个索引文件集。假设你发布后发出了1,000次提交,这意味着Lucene正在磁盘上搜索1000套索引文件。

执行索引优化时,所有这些索引段都合并为一个段。 Zend documentation中有关于此问题的部分以及有关Indexing Performance in the best practices section.

的更多信息

调用optimize可能是一项昂贵的操作。但定期(每天批量处理?)以保持索引段的数量可管理非常重要。