Php Lucene搜索速度太慢了

Php Lucene搜索速度太慢了,php,performance,search,indexing,lucene,Php,Performance,Search,Indexing,Lucene,我们网站的Lucene搜索速度非常慢,完全无法使用-30秒或更长的时间在6000条记录中搜索“狗” JO_Search_Lucene_Search_QueryParser::setDefaultEncoding('UTF-8'); $hits = $index->find($query); foreach ($hits as $hit) { $ids[] = $hit->item_id; } 我对Lucene的搜索和索引一无所知 JO_Search_Lucene_Sear

我们网站的Lucene搜索速度非常慢,完全无法使用-30秒或更长的时间在6000条记录中搜索“狗”

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

foreach ($hits as $hit) {
    $ids[] = $hit->item_id;
}
我对Lucene的搜索和索引一无所知

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

foreach ($hits as $hit) {
    $ids[] = $hit->item_id;
}
我意识到有很多方法可以优化某些东西

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

foreach ($hits as $hit) {
    $ids[] = $hit->item_id;
}
我已经运行了探查器,并将结果粘贴到这里

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

foreach ($hits as $hit) {
    $ids[] = $hit->item_id;
}
以下是索引控制器代码,大部分时间都会被吞掉:

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

foreach ($hits as $hit) {
    $ids[] = $hit->item_id;
}
$index->find($query)
转到4个实现。如果有用的话,我可以粘贴这些稍长的函数,但这里只粘贴了注释说明作为开始:

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

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

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

foreach ($hits as $hit) {
    $ids[] = $hit->item_id;
}
/**
 * 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
 */
第二:

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

foreach ($hits as $hit) {
    $ids[] = $hit->item_id;
}
/**
 * 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
 */
第三:

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

foreach ($hits as $hit) {
    $ids[] = $hit->item_id;
}
/**
 * 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
 */
第四:

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

foreach ($hits as $hit) {
    $ids[] = $hit->item_id;
}
/**
 * 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
 */
下面是执行“时间”、“自己的时间”和“调用”的快照。如有任何关于在何处查找的指导,我们将不胜感激

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

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

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

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

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

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

在中,跟踪中的违规方法是执行strcmp(187158次)

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

foreach ($hits as $hit) {
    $ids[] = $hit->item_id;
}
这个特定的调用链从磁盘读取数据。271837次读取(
\u fread
s)对于包含约6000个项目的健康索引来说似乎太多了

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

foreach ($hits as $hit) {
    $ids[] = $hit->item_id;
}
很可能这个指数从未被优化过。这对您来说意味着,每次发出
commit
时,所有临时写入都会持久化到磁盘(作为一个新的、不可变的Lucene索引段)。现在Lucene正在搜索两组索引文件。假设您自启动以来发布了1000次提交,这意味着Lucene正在磁盘上搜索1000组索引文件

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

foreach ($hits as $hit) {
    $ids[] = $hit->item_id;
}
在执行索引优化时,所有这些多个索引段都合并为一个段。这本书中有一节是关于这一点的,还有更多关于这一点的

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

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

调用
optimize
可能是一项代价高昂的操作。但是,定期(也许是每日批处理?)保持索引段的数量可控是很重要的

如果你不发布一些代码,没有人会回答这个问题。请看。谢谢@ltrzesniewski,我不知道。我已经添加了一些代码和注释,但是代码太多了,我不想让它过载。如果有特定的代码是有用的,我很乐意粘贴更多。你不太明白我的意思。尝试提取一个显示您所经历行为的独立示例。毕竟我们无法调试评论:)谢谢@ltrzesniewski。问题是我甚至不知道该给你发哪种代码。Lucene被嵌入Zend框架之上的JO框架中。当我逐步阅读代码时,它会在10多个不同的文件和许多函数之间跳跃。我希望个人资料能给人一个想法,但这听起来像是一厢情愿。感谢您花时间回复,如果我们需要帮助,我会让您知道我们是否需要一些代码。再次感谢!我很好奇您的查询是什么样子的,以及您是如何分析字段的。这样的性能让我想知道我们是否在寻找针对未分析字段的双通配符搜索,或者类似的东西。非常感谢,Peter。这给了我一个开始寻找的地方。我真的很感谢你花时间来分析这件事。
JO_Search_Lucene_Search_QueryParser::setDefaultEncoding('UTF-8');
$hits = $index->find($query);

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