我们网站的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;电话"。任何关于在哪里看的指导都表示赞赏。
答案 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
可能是一项昂贵的操作。但定期(每天批量处理?)以保持索引段的数量可管理非常重要。