当前位置: 首页 > 知识库问答 >
问题:

突出显示时Solr性能非常慢

董意蕴
2023-03-14

我配置了一个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

我所有的研究似乎都没有提供线索来解释为什么highlight的表现如此糟糕。一时心血来潮,我决定看看OmitNormals=true属性是否会产生效果,我修改了文本字段,删除了数据,然后从头开始重新加载。

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

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

然而,因为我们希望OmitNormals=true处于适当位置,所以我的永久解决方案是有两个“text”字段的副本,一个有属性,一个没有属性。其想法是对一个字段执行查询,并突出显示另一个字段。所以现在模式看起来像

<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秒。要么是第一次取消OmitNormals是侥幸,要么是发生了其他事情。我不知道。。。

使用jVisualVM捕获CPU示例显示了以下两种使用大部分CPU的方法

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

我看到初始化方法低至54%,民调数字高达30%。

有什么想法吗?还有其他地方可以找到瓶颈吗?

谢谢

使现代化

我已经用相同的数据集但不同的配置做了一系列测试,这是我的发现......尽管我不明白我的发现。

  • 快速突出显示性能要求omitNorms不设置为true。(不知道omitNorms和突出显示彼此有什么关系。)
  • 然而,这似乎只有在查询和突出显示都针对同一字段(即df=hl.fl)执行时才是正确的。(同样,不知道为什么...)
  • 而另一个,仅当针对模式中存在的默认文本字段执行时。

以下是我的测试方法--

  • 测试针对大约525000份文档

我发现了什么--

  • 如果只使用文本字段,并且存在OmitNormals=true,则性能很差(10秒响应时间)

我很困惑。。。。

共有1个答案

景明诚
2023-03-14

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

我们正在为一组二进制文档中的文本编制索引,需要Solr来维护文档和文本的一些元数据。用户需要根据元数据搜索文档,在内容中进行全文搜索,并查看相关内容的亮点和片段。如果突出显示/代码段的内容位于每个文档中的更远位置(例如,第50页而不是第2页),则性能问题会变得更糟

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

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

希望有帮助。

 类似资料:
  • 本文向大家介绍HTML 突出显示,包括了HTML 突出显示的使用技巧和注意事项,需要的朋友参考一下 示例 该<mark>元素是HTML5中的新元素,用于“由于其在另一个上下文中的相关性”而标记或突出显示文档中的文本。1 最常见的示例是用户输入搜索查询并显示结果以突出显示所需查询的搜索结果。 输出: 常见的标准格式是黄色背景上的黑色文本,但是可以使用CSS进行更改。

  • 搜索“adida shi”,应该会得到两个商品,一个是名称为“adidas shirts”,另一个是“adidas red shirts” 预期突出显示: 实际突出显示: 有什么想法让它工作吗?

  • 问题内容: 我正在创建一个使用链接(JButton扩展名)的帮助系统,该链接可以展开和折叠带有JLabel的子面板。链接和可折叠面板都可以,但是我在实现查找对话框时遇到了麻烦。我希望能够突出显示用户搜索的部分文本。我认为我使用文本属性为链接中的文本加下划线使我无法突出显示文本的某些部分,但是我不确定如何做不同的事情。这是我的链接子类的链接类的代码: 如何在链接中实现突出显示的文本而又不去除下划线?

  • 我在Windows和OSX上使用IntelliJ开发一个包含ScalaJS部分的Play framework项目。该项目使用Activator在两个系统上正确构建和运行。 然而,Windows上的IntelliJ编辑器在我的源代码中下划线,而在OSX上却没有。如果我导航到与错误相关的库源代码,我会找到不同的文件。例如,在Windows上,它可能转到:

  • 问题内容: 我可以高亮显示一些文本,使其从一个值开始,然后从另一个值结束,如下所示,但颜色为黄色吗? “” JTextPane 高亮显示 文本“” 谢谢。 问题答案: 通常,有几种可能性,具体取决于您对“突出显示”的真正含义:-) 通过在文档级别更改任意文本部分的样式属性来突出显示,例如 通过textPane级别上的荧光笔突出显示:

  • 我环顾四周,找不到一种自动完成这项工作的方法。所以: 我在vim中内置了一些语法高亮,我想转移到vscode。我至少有两个部分卡住了。 到目前为止,我的情况是这样的:我已经构建了一个vscode语言扩展——设置了一些基本的语法规则,并将其复制到vscode config文件夹中。 我遇到麻烦的部分-我可以在某些字段的含义中澄清一下-命名约定。 和语法的嵌套解析,这些东西只出现在其他元素中。 下面是