【发布时间】: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