【问题标题】:Solr Query Performance on Large Number Of Dynamic FieldsSolr 在大量动态字段上的查询性能
【发布时间】:2019-07-28 03:08:12
【问题描述】:

这个问题是我上一个问题的后续问题:Is child documents in solr anti-pattern?

我正在创建一个关于动态现场性能的新问题,因为我没有找到任何关于该主题的最新相关帖子,并且觉得应该在这里单独提出一个问题。

我知道动态字段被视为静态字段,并且在性能方面两者都相似。

此外,根据我的阅读,就内存而言,动态字段效率不高。假设一个文档有 100 个字段,而另一个文档有 1000 个(集合中的最大字段数),Apache Solr 将分配内存块以支持集合中所有文档的所有 1000 个字段。

我有一个要求,我有 6-7 个字段可以作为子文档的一部分,每个父文档最多可以有 300 个子文档。这意味着每个父文档可能有大约 2000 个字段。

当我们在文档中有如此大量的字段时,对查询的性能会有什么影响?

【问题讨论】:

    标签: solr


    【解决方案1】:

    这真的取决于你想用这个字段做什么以及这些字段的定义是什么。使用docValues,解决了稀疏字段(即仅在文档总数中的一小部分具有值的字段)的内存使用的大多数早期问题。

    此外,您通常可以将这些动态字段重写为单个多值字段以进行过滤,而不是对每个字段进行过滤(即common_field:field_prefix_value 其中common_field 包含您要过滤的值,前缀为字段名称/唯一字段ID)。

    无论如何,最后一种情况是,这取决于您总共拥有多少文档。如果您只有 1000 个文档,则无论如何都不是问题。如果您有一百万,它曾经是 - 取决于您需要这些动态字段的用途。这些天来,这真的不是问题,我会从天真的、直接的解决方案开始,看看它是否适合您的用例。如果不确切知道这些字段将包含什么、这些字段的用例是什么、它们将用于什么以及您的应用程序的查询配置文件,就很难说。

    如有必要,还可以考虑使用“side car”索引,即使用主索引中重复数据的特殊索引来解决某些查询或查询要求。您根据用例选择要搜索的索引,然后将适当的数据返回给用户。

    【讨论】:

    • 感谢您的回复。我们有大约 100k 个文档,在这些文档上,1-2 个动态字段将用于过滤查询,1(price) 字段将用于范围分面和基于范围的过滤查询。所以我们将有 2-3 个带有 docValues 的字段
    • 应该可以的。我们之前在稀疏字段方面遇到的问题是 4.0 之前的版本和排序。在这些情况下,为每个字段的整个文档集构建和调整缓存列表(并且该字段缓存不能被禁用/调整大小/等),而不仅仅是那些存在该字段的文档。 docValues 对排序有很大帮助,因此即使这样也不再是问题(而且 Solr 今天比 4.0 之前的版本成熟得多)。看到你可以手动调整过滤器缓存,你应该很高兴。
    • 谢谢!只是对我之前的评论的更正,当我说 1-22-3 动态字段时,我的意思是前缀名称,所以,字段的实际数量将乘以接近 300。这会改变什么吗?感谢有关稀疏字段问题更新的更新,我不知道已修复 :)
    • 它本身并没有真正修复,但docValues 根据我的经验解决了这个问题。我们遇到了大约 2.5k 动态字段的问题,但它花了一些时间才变得明显 - 重新启动 Solr 以清除字段缓存使事情再次正常工作。那时我们没有花任何时间调整 JVM 内存,所以这些天你可能会在出现任何问题之前把它做得更远。我想你会没事的。
    猜你喜欢
    • 2013-07-28
    • 2015-04-10
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2015-09-06
    相关资源
    最近更新 更多