【发布时间】: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 not 有 omitNorms = true 而 text2 有时,查询会突出显示 文本在亚秒级时间内返回,所有其他组合的响应时间为 10-30 秒。
- 当 text 确实有 omitNorms = true 并且 text2 没有 not,all > 在 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 毫秒内返回。