将单独的查询合并为一个查询 [英] merge separate queries into one query
本文介绍了将单独的查询合并为一个查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我使用 boolQueryBuilder 进行以下查询,该查询检查 status1 或 status2 并且时间小于 currentTime 是否匹配:
i have the following query using boolQueryBuilder which check if status1 or status2 AND the time is less than currentTime is matchs :
public BoolQueryBuilder createSearchQuery(Long currentTime) {
// Build and operator
final BoolQueryBuilder firstAndOperator = createAndOperator(currentTime, "status1");
// Build AND operator
final BoolQueryBuilder secondAndOperator = createAndOperator(currentTime, "status2);
// Build OR
return createOrOperator(firstAndOperator, secondAndOperator);
}
private BoolQueryBuilder createOrOperator(BoolQueryBuilder firstAndOperator, BoolQueryBuilder secondAndOperator) {
return new BoolQueryBuilder()
.should(firstAndOperator)
.should(secondAndOperator);
}
private BoolQueryBuilder createAndOperator(Long currentDate, Status status) {
return QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery(STATUS, status))
.must(QueryBuilders.rangeQuery(TIME).lte(currentDate));
}
如何使用 multiMatchQuery 合并它们?
how to merge them using multiMatchQuery?
这是我的尝试,但它不起作用
this is my try but it does not work
public BoolQueryBuilder createSearchQuery(Long currentTime) {
return new BoolQueryBuilder()
.should(QueryBuilders
.multiMatchQuery("status1" + " " + "status2", STATUS)
.type(MultiMatchQueryBuilder.Type.PHRASE_PREFIX)
.operator(Operator.OR))
.must(QueryBuilders.rangeQuery(TIME)
.lte(currentTime));
}
推荐答案
我认为您的 multi_match
查询是错误的,您应该使用 filter
而不是 must
也是如此.所以应该是这样的:
I think your multi_match
query is wrong and you should use filter
instead of must
as well. So it should be like this instead:
public BoolQueryBuilder createSearchQuery(Long currentTime) {
return new BoolQueryBuilder()
.should(QueryBuilders
.multiMatchQuery(STATUS, "status1", "status2")
.operator(Operator.OR))
.filter(QueryBuilders.rangeQuery(TIME)
.lte(currentTime));
但我不会为此使用 multi_match
,而是利用两个 term
过滤器:
But I wouldn't use multi_match
for that purpose, instead I would leverage two term
filters:
public BoolQueryBuilder createSearchQuery(Long currentTime) {
return new BoolQueryBuilder()
.minimumShouldMatch(1)
.should(QueryBuilders.matchQuery("status1", STATUS))
.should(QueryBuilders.matchQuery("status2", STATUS))
.filter(QueryBuilders.rangeQuery(TIME)
.lte(currentTime));
这篇关于将单独的查询合并为一个查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文