elastic-builder如何将boolQuery与rangeQuery合并到同一个查询中
问题原因
你使用的ES查询构造库中,RequestBodySearch.query() 方法是覆盖式赋值,多次调用会直接覆盖之前配置的查询条件,因此你之前的写法只会保留最后传入的范围查询。
解决方案
要实现两个条件同时满足(逻辑与),需要把两个查询都放到同一个Bool查询的filter上下文中,有两种实现方式:
方案1:合并到同一个Bool查询
直接重构查询构造逻辑,把标签过滤和日期范围过滤都加入同一个Bool查询的过滤条件:
createCombinedQuery(): Query { // 初始化Bool查询 const boolQuery = esb.boolQuery() .filter(esb.termsQuery("tags", ["tag1", "tag2", "tag3"])); // 构造日期范围查询 const rangeQuery = esb.rangeQuery("createdDate"); if (this._rangeStartDate) { const startDate = moment(this._rangeStartDate); rangeQuery.gte(startDate.format("MM/DD/YYYY")); } if (this._rangeEndDate) { const endDate = moment(this._rangeEndDate); rangeQuery.lte(endDate.format("MM/DD/YYYY")); } // 将日期范围查询也加入Bool的过滤条件 boolQuery.filter(rangeQuery); return boolQuery; }
构造搜索请求时直接传入组合后的查询即可:const searchQuery = esb.RequestBodySearch().query(this.createCombinedQuery())
方案2:外层套Bool查询复用现有方法
如果不想修改已经写好的createBoolQuery和createRangeQuery方法,可以在外层新增一个Bool查询包裹两个现有查询:
// 外层Bool查询同时包含两个过滤条件 const combinedQuery = esb.boolQuery() .filter(this.createBoolQuery()) .filter(this.createRangeQuery()); const searchQuery = esb.RequestBodySearch().query(combinedQuery);
两种写法生成的最终查询都会同时生效,且filter上下文不会计算相关性得分,查询性能更高。
内容的提问来源于stack exchange,提问作者Keannylen
相关产品推荐
相关产品推荐

