【问题标题】:Very slow Solr performance when highlighting突出显示时非常慢的 Solr 性能
【发布时间】:2013-10-25 08:35:08
【问题描述】:

我配置了一个 Solr 4.4.0 内核,其中包含大约 630k 个文档,原始大小约为 10 GB。为了查询和突出显示,每个字段都被复制到 text 字段。当我在没有突出显示的情况下执行搜索时,结果会在大约 100 毫秒 内返回,但当打开突出显示时,相同的查询需要 10-11 秒。我还注意到,后续查询相同的字词继续花费大约相同的 10-11 秒。

我对该字段的初始配置如下

<field name="text" type="text_general" indexed="true" stored="true"
   multiValued="true"
   omitNorms="true"
   termPositions="true"
   termVectors="true"
   termOffsets="true" />

发送的查询类似于以下内容

http://solrtest:8983/solr/Incidents/select?q=error+code&fl=id&wt=json&indent=true&hl=true&hl.useFastVectorHighlighter=true

我的所有研究似乎都没有提供关于为什么高光表现如此糟糕的线索。一时兴起,我决定看看 omitNorms=true 属性是否会起作用,我修改了 text 字段,清除了数据,然后从头开始重新加载。

<field name="text" type="text_general" indexed="true" stored="true"
   multiValued="true"
   termPositions="true"
   termVectors="true"
   termOffsets="true" />

奇怪的是,这似乎解决了问题。带有突出显示的初始查询耗时 2-3 秒,后续查询耗时不到 100 毫秒

但是,因为我们想要 omitNorms=true,所以我的永久解决方案是拥有 两个 的“文本”字段副本,一个带有属性,一个带有属性没有。这个想法是针对一个字段执行查询并突出显示另一个字段。所以现在架构看起来像

<field name="text" type="text_general" indexed="true" stored="true"
   multiValued="true"
   omitNorms="true"
   termPositions="true"
   termVectors="true"
   termOffsets="true" />

<field name="text2" type="text_general" indexed="true" stored="true"
   multiValued="true"
   termPositions="true"
   termVectors="true"
   termOffsets="true" />

查询如下

http://solrtest:8983/solr/Incidents/select?q=error+code&fl=id&wt=json&indent=true&hl=true&hl.fl=text2&hl.useFastVectorHighlighter=true

同样,数据被清除并重新加载了相同的 630k 文档,但这次索引大小约为 17 GB。 (正如预期的那样,因为“文本”字段上的内容是重复的。)

问题是性能数字回到了原来的每次运行 10-11 秒。要么第一次删除 omitNorms 是侥幸,要么发生了其他事情。我不知道是什么...

使用jVisualVM捕获CPU样本展示了以下两种使用大部分CPU的方法

org.apache.lucene.search.vectorhighlight.FieldPhraseList.<init>()    8202 ms (72.6%)
org.eclipse.jetty.util.BlockingArrayQueue.poll()                     1902 ms (16.8%)

我见过init方法低至54%,poll数高达30%。

有什么想法吗?我可以寻找其他任何地方来追踪瓶颈吗?

谢谢

更新

我用相同的数据集但不同的配置做了一堆测试,这就是我的发现......虽然我不明白我的发现。

  • 快速突出显示性能要求 omitNorms 不设置为 true。 (不知道 omitNorms 和突出显示之间有什么关系。)
  • 但是,这似乎只有在查询和突出显示都针对 same 字段(即 df = hl.fl)执行时才成立。 (再次,不知道为什么......)
  • 还有另一个,仅当针对架构中存在的默认 text 字段完成时。

这是我的测试方法 -->

  • 测试针对大约 525,000 个文档
  • 几乎所有字段都复制到了多值文本字段
  • 在某些测试中,几乎所有字段复制到发送多值 text2 字段(此字段与 text 除了它有相反的 omitNorms 设置
  • 每次更改配置,都会停止 Solr 实例,删除数据文件夹,并重新启动实例

我发现了什么-->

  • 当仅使用 text 字段并且 omitNorms = true 存在时,性能很差(10 秒响应时间)
  • 当只使用 text 字段并且 omitNorms = true 不存在时,性能非常好(亚秒级响应时间)
  • text notomitNorms = truetext2 有时,查询会突出显示 文本在亚秒级时间内返回,所有其他组合的响应时间为 10-30 秒。
  • text 确实有 omitNorms = true 并且 text2 没有 notall > 在 7-10 秒内返回带有突出显示的查询组合。

我很困惑....

【问题讨论】:

  • 不是答案,但是...你能试试PostingsHighlighter吗?另一个时刻是需要更少的磁盘空间 - 根据Michael McCandless blog post 的说法,差异是“1000 万个文档英语维基百科索引约为 7.8 倍”。但它不支持通配符搜索。
  • 另外,here 是一些类似的问题。
  • @rchukh - 我已经看到了您链接到的支持帖子。这就是我想到使用 jvisualvm 并发现这两种方法占用大量 CPU 的地方。关于另一个荧光笔,我也读到过,但推迟了实施,因为没有合乎逻辑的理由说明快速向量对我的数据集来说不是那么快。 (但如果必须,我会朝那个方向前进。)
  • 只是为了澄清 - 你有多少字段?我们是在谈论 10-20 还是 100 甚至更多?
  • 按照上面邮件列表中的想法(该领域中有许多类似的术语),我能够重现这个问题......可能有点太多了,因为在我的 524.07 MB 索引和 10204 文档"QTime: 158465" 用于限制为 1 行的搜索请求...奇怪的是,相同的请求 没有 hl。 useFastVectorHighligter 在 174 毫秒内返回。

标签: solr lucene


【解决方案1】:

我知道这有点过时了,但我遇到了同样的问题并想加入我们的方法。

我们正在从一堆二进制文档中索引文本,并且需要 Solr 来维护有关文档和文本的一些元数据。用户需要根据内容中的元数据和全文搜索来搜索文档,以及查看相关内容的亮点和sn-ps。如果突出显示/sn-p 的内容位于每个文档中的更远位置(例如第 50 页而不是第 2 页),性能问题会变得更糟

由于突出显示效果不佳,我们不得不将每个文档分解为多个 solr 记录。根据内容字段的长度,我们会将其分成更小的块,将元数据属性复制到每条记录,并为每条记录分配一个每个文档的唯一 ID。然后在查询时,我们将搜索所有这些记录的内容字段,并按我们分配的唯一字段进行分组。由于内容字段更小,Solr 不必深入每个内容字段,而且从最终用户的角度来看,这是完全透明的;尽管它确实为我们增加了一些索引开销。

此外,如果您选择这种方法,您可能需要考虑在每个“子文档”之间稍微重叠几秒,以确保如果在两秒的边界处存在短语匹配,它将正确返回。

希望对您有所帮助。

【讨论】:

  • 您建议的最大文档大小是多少?
  • @Heidar 我建议您在您的环境中使用您的数据运行一些基准测试。
猜你喜欢
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
  • 2021-06-10
  • 2017-03-24
  • 2014-06-05
  • 2013-08-30
  • 2010-10-24
相关资源
最近更新 更多