我有一个用例,我有一个 boolQueryBuilder
,它在不同类型的查询中很常见。
现在对于不同的查询,我需要向 boolQueryBuilder
添加不同的 must()
。
基本上,假设我有一个通用的 boolQueryBuilder
,它是用来过滤带有特定标签的书籍的。现在,当我收到选择特定类型 1/类型 2 的请求时,我必须这样做
boolQueryBuilder.must(type1)
用于请求 1
boolQueryBuilder.must(type2)
用于 request2(不应该有 type1)
我尝试了 deepcopy
、serialize
和 deserialize
但它们非常非常慢,大约需要 3 秒
我需要 type1 以及 request1 中的标签,type2 以及 request2 中的标签。
使用我拥有的公共(public)构建器而不是一次又一次地重新构建公共(public)查询的最佳方法是什么?
最佳答案
这不是最有效的解决方案,但实现起来最快,而且不会影响性能。对于真正有效的实现,您可能需要编写一个自定义构建器来创建您的副本。
我创建了一个 List<QueryBuilder>
并添加了我的 TermQueryBuilder
和 TermsQueryBuilder
给它。创建 List
的 QueryBuilder
会支持
添加大多数查询。
因为我每次都必须重新使用它来获得 BoolQueryBuilder
的新副本,我只是初始化它并遍历列表以添加查询。
List<QueryBuilder> queryBuilderList = new ArrayList<>();
queryBuilderList.add(QueryBuilders.termQuery(key, value));
queryBuilderList.add(QueryBuilders.termsQuery(key, value));
// Somewhere later
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
for (int i = 0; i < queryBuilderList.size(); i++) {
boolQueryBuilder.must(queryBuilderList.get(i));
}
关于elasticsearch - 如何深拷贝elasticsearch QueryBuilder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57101646/