在我制作之前,我试图找到基准来比较Elasticsearch Spring Data和Elasticsearch HighLevelClient的性能,用于具有复杂嵌套聚合的搜索查询。
但我唯一发现的是,如果您需要 CRUD 操作,则更容易使用弹簧数据和其他一些功能作为自动配置。 但它们都与性能无关。
我想知道你们中是否有人同时使用过两者并测试过它们的性能?是否有任何技术原因表明其中一个在此类查询中更快?
这里最重要的部分是确保获得正确的基础查询。我们最近遇到了一个案例,错误的设置使我们损失了近 10 倍的性能。Spring Data 使用高级 Rest 客户端,因此我通常预计没有开销或开销很小;如果基础查询相同。框架差异可能足够小,我会优先考虑开发速度和熟悉度。
我们的错误是返回聚合中的底层文档,这是要发送/(反)序列化的更多数据,并且也不会使用缓存 - 这为我们的聚合带来了 400 毫秒与 40 毫秒的差异(当我们点击缓存时)。
编辑P.J.Meisch(希望,你不介意@xeraa),不需要额外的答案:
如前所述,Spring Data Elasticsearch 使用 ElasticsearchRestHighLevelClient(稍后将使用新的 Elasticsearch 客户端),要创建聚合查询,您需要使用 Elasticsearch 的查询构建器构建查询的NativeSearchQuery
。因此,直接使用 RestHighLevelClient 时,构建查询是相同的。
正如@xeraa已经提到的,如果你只需要 aggs 而不是查询数据,请确保不返回源文档,在 Spring Data Elasticsearch 中,您可以使用NativeSearchQueryBuilder.withMaxResults(0)
.然后,将查询作为 usal 传递给ElasticsearchOperations.search()
方法。
Spring Data Elasticsearch 不会对返回的聚合进行任何解析,您必须在那里执行与使用客户端相同的操作。
所以我看不出Spring Data Elasticsearch会导致性能问题。