【问题标题】:Lucene search is obscenely slowLucene 搜索速度非常慢
【发布时间】:2016-03-12 20:07:36
【问题描述】:

我们网站的 Lucene 搜索速度非常慢且完全无法使用 - 在大约 6,000 条记录中搜索“狗”一词需要 30 秒或更长时间。

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

下面是执行“时间”、“自己的时间”和“调用”的快照。任何关于在哪里看的指导都表示赞赏。

【问题讨论】:

  • 如果您不发布一些代码,没有人会回答这个问题。请参阅mcve
  • 谢谢@ltrzesniewski,我不知道。我添加了一些代码和 cmets,但是代码太多,我不想重载它。如果有有用的特定代码,我很乐意粘贴更多。发送。
  • 你不太明白我的意思。尝试提取一个独立的示例来显示您正在经历的行为。毕竟我们无法调试 cmets :)
  • 谢谢@ltrzesniewski。问题是我什至不知道要给你发送哪个代码。 Lucene 嵌入在 Zend 框架之上的 JO 框架中。当我单步执行代码时,它会在 10 多个不同的文件和许多函数之间跳转。我希望个人资料能给某人一个想法,但听起来那是一厢情愿的想法。感谢您抽出宝贵时间回复,如果我们对一些需要帮助的代码进行三角测量,我会通知您。再次感谢!
  • 我很好奇您的查询是什么样的,以及您是如何分析这些字段的。这样的表现让我想知道我们是否会针对未分析的字段进行双通配符搜索,或者类似的东西。

标签: php performance search indexing lucene


【解决方案1】:

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

这个特定的调用链从磁盘读取。而 271,837 次读取 (_freads) 对于具有约 6000 个项目的健康索引来说似乎过多!

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

在执行索引优化时,所有这些索引段都合并为一个段。 Zend documentation 中有一个部分是关于这个和更多关于 Indexing Performance in the best practices section.

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

【讨论】:

  • 非常感谢,彼得。这给了我一个开始寻找的地方。非常感谢您抽出宝贵的时间对此进行分析。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 2015-09-18
  • 2016-10-10
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多