突出显示时,Solr性能非常慢

时间:2013-10-17 01:31:51

标签: solr lucene

我配置了Solr 4.4.0核心,其中包含大约630k文档,原始大小约为10 GB。为了查询和突出显示,每个字段都会复制到文本字段。当我执行不带突出显示的搜索时,结果会以大于 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 属性是否有效,我修改了文本字段,清除了数据,并从头开始重新加载。 / p>

<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%,民意测验数高达30%。

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

由于

更新

我使用相同的数据集但不同的配置进行了一系列测试,这是我发现的...虽然我不理解我的发现。

  • 快速突出显示性能要求 omitNorms不能设置为true 。 (不知道omitNorms和突出显示有什么关系。)
  • 但是,如果查询和突出显示都是针对相同的字段(即df = hl.fl)执行的,那么这似乎是正确的。 (再次,不知道为什么......)
  • 然而,只有在模式中存在的默认文本字段完成时才会这样做。

以下是我测试的方法 - &gt;

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

我找到了什么 - &gt;

  • 当仅使用文本字段且 omitNorms = true 存在时,效果不佳(10秒响应时间)
  • 当仅使用文本字段且 omitNorms = true 不存在时,效果非常好(亚秒响应时间)< / LI>
  • 文字 omitNorms = true text2 时,突出显示文字在亚秒内返回,所有其他组合导致10-30秒的响应时间。
  • 文字确实 omitNorms = true text2 时,全部 >在7-10秒内返回突出显示的查询组合。

我很困惑......

1 个答案:

答案 0 :(得分:1)

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

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

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

此外,如果您选择此方法,您可能需要考虑在每个&#34;子文档&#34;之间稍微重叠秒数。确保如果在两秒钟的边界处有短语匹配,它将被正确返回。

希望它有所帮助。