elasticsearch - 如何深拷贝elasticsearch QueryBuilder?

标签 elasticsearch deep-copy

我有一个用例,我有一个 boolQueryBuilder,它在不同类型的查询中很常见。

现在对于不同的查询,我需要向 boolQueryBuilder 添加不同的 must()

基本上,假设我有一个通用的 boolQueryBuilder,它是用来过滤带有特定标签的书籍的。现在,当我收到选择特定类型 1/类型 2 的请求时,我必须这样做

boolQueryBuilder.must(type1) 用于请求 1 boolQueryBuilder.must(type2) 用于 request2(不应该有 type1)

我尝试了 deepcopyserializedeserialize 但它们非常非常慢,大约需要 3 秒

我需要 type1 以及 request1 中的标签,type2 以及 request2 中的标签。

使用我拥有的公共(public)构建器而不是一次又一次地重新构建公共(public)查询的最佳方法是什么?

最佳答案

这不是最有效的解决方案,但实现起来最快,而且不会影响性能。对于真正有效的实现,您可能需要编写一个自定义构建器来创建您的副本。 我创建了一个 List<QueryBuilder>并添加了我的 TermQueryBuilderTermsQueryBuilder给它。创建 ListQueryBuilder会支持 添加大多数查询。
因为我每次都必须重新使用它来获得 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/

相关文章:

search - ElasticSearch 中第一个词的得分更高

elasticsearch - 使用 Elasticsearch 基于唯一标识符构建流/ channel 结果

cython - 对 cython 类使用深度复制函数的问题

javascript - Ruby => Javascript 翻译

elasticsearch - 在 netty 中将 HTTP 请求重定向到 HTTPS

mapping - not_analyzed 字段,其 doc_values 仍在 fielddata 缓存中

python - 如何将提取的数据转换成python字典?

java - java中的深度 copy-and-swap 子树

java - 深度复制“对象”类型

objective-c - 制作 UIView 及其所有 subview 的深拷贝