【问题标题】:Performance issue with multivalued field in LuceneLucene 中多值字段的性能问题
【发布时间】:2015-06-27 00:23:16
【问题描述】:

我们正在使用 Lucene 4.7 来构建和查询一个相当大的数据集(超过 1.1 亿个文档)。

我们用于分面的文档字段之一定义如下:

<field name="topic_paths"
       type="string"
       indexed="false"
       stored="false"
       docValues="true"
       multiValued="true"
       termVectors="false"
       termPositions="false"
       termOffsets="false"/>

每当我们在查询中包含此字段时,它们都会变得非常缓慢:搜索中包含的每个 topic_path 值大约需要 7 秒,因此对于四个 topic_path 值大约需要 30 秒(在我们的例子中是典型的)。

不使用此字段的查询非常快(15 毫秒)。

我们是否应该期望 Lucene 具有用于分面的多值字段的这种性能?我们的字段定义有什么问题或次优吗?我们可以使用哪些技巧来加快搜索速度?

详情:

  • 硬件:Xen VM、2.5 GHz 的 8 核 Xeon CPU E5-2670 v2、64 GB RAM
  • 操作系统:Windows Server 2012 标准版
  • JVM:从 -Xmx8000m 开始(Lucene 使用了大约 45%)
  • Lucene 查询是单线程的

【问题讨论】:

  • 我猜方面将使用 docValues 所以性能取决于 os 文件缓存效率。提取构面时是否看到很多 IO?如果您第二次运行相同的查询会更快吗?你给 java (Xmx) 多少堆空间?
  • 如果我第二次运行完全相同的查询,它是即时的(感谢我假设的查询缓存)。我还不知道会产生多少磁盘流量查询,因为由于某种原因,Process Explorer 中的 I/O 计数器被固定为 0。但是查询似乎受 CPU 限制。让我补充一点,单个查询是单线程运行的。我们将-Xmx8000m 传递给JVM; Lucene 似乎使用了其中的 45%。
  • 我猜这是预热 os 文件缓存的问题。您能否尝试运行带有构面的长 MatchAllQuery 并查看所有后续构面查询是否更快?您还可以检查虚拟内存使用情况。

标签: java performance indexing solr lucene


【解决方案1】:

阅读这篇文章,http://wiki.apache.org/solr/SchemaXml#Fields

您需要“索引”您的字段以将其包含在搜索/分面中,否则 Solr 将毫无例外地跳过该字段

【讨论】:

  • 我们尝试设置indexed="true",但这对性能没有影响。据我了解,indexed="true" 在设置docValues="true" 时是多余的。
  • 我们通过切换到 Elasticsearch 解决了我们的问题。
  • 如果你直接移植你的设置,Elasticsearch 也会有同样的性能问题,因为它们都使用 Lucene 进行核心搜索。您的问题仅因更改设置而得到解决。 index=true 是正确答案:您是否在指定之后重新索引所有内容?
猜你喜欢
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 2010-09-07
相关资源
最近更新 更多