我配置了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%。
有什么想法吗?我可以寻找其他任何可以追踪瓶颈的地方吗?
由于
更新
我使用相同的数据集但不同的配置进行了一系列测试,这是我发现的...虽然我不理解我的发现。
以下是我测试的方法 - &gt;
我找到了什么 - &gt;
我很困惑......
答案 0 :(得分:1)
我知道这有点过时了,但我遇到了同样的问题,并希望用我们的方法加入。
我们正在从一堆二进制文档中索引文本,并且需要Solr来维护有关文档和文本的一些元数据。用户需要在内容中搜索基于元数据和全文搜索的文档,以及查看相关内容的重点和片段。如果突出显示/片段的内容位于每个文档的更远位置(e.x.第50页而不是第2页),则性能问题会变得更糟。
由于突出显示效果不佳,我们不得不将每个文档分解为多个solr记录。根据内容字段的长度,我们将其分成较小的块,将元数据属性复制到每个记录,并为每个记录分配每个文档的唯一ID。然后在查询时,我们将搜索所有这些记录的内容字段,并按我们分配的唯一字段进行分组。由于内容字段较小,Solr不必深入到每个内容字段,加上从最终用户的角度来看,这是完全透明的;虽然它确实为我们增加了一些索引开销。
此外,如果您选择此方法,您可能需要考虑在每个&#34;子文档&#34;之间稍微重叠秒数。确保如果在两秒钟的边界处有短语匹配,它将被正确返回。
希望它有所帮助。