大量动态字段的 Solr 查询性能

Solr Query Performance on Large Number Of Dynamic Fields

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

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

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

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

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

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

这实际上取决于您想对该字段做什么以及这些字段的定义。使用 docValues,解决了大多数早期稀疏字段(即仅在文档总数中具有少量值的字段)的内存使用问题。

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

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

还可以考虑在必要时使用 "side car" 索引,即一个特殊的索引,其中包含来自主索引的重复数据,以解决某些查询或查询需求。您根据用例选择要搜索的索引,然后 return 将适当的数据提供给用户。