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