【问题标题】:merge separate queries into one query将单独的查询合并为一个查询
【发布时间】:2021-03-12 14:29:48
【问题描述】:

我使用 boolQueryBuilder 进行以下查询,检查 status1 或 status2 并且时间小于 currentTime 是否匹配:

 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 合并它们?

这是我的尝试,但它不起作用

 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));
    }

【问题讨论】:

  • 不清楚需要合并什么...
  • 关于转换语法
  • 使用多查询
  • 是的,但是不清楚要与其他查询合并什么查询?以及它们应该如何合并......也许用 DSL 语言编写您期望的查询,这样会更清楚
  • 所以我想要的是,用 multiyquery 简化应该和必须的操作

标签: spring-boot elasticsearch spring-data-jpa


【解决方案1】:

我认为您的multi_match 查询是错误的,您也应该使用filter 而不是must。所以应该是这样的:

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 过滤器:

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));

【讨论】:

  • 我得到 SearchHits{totalHits=0, totalHitsRelation=EQUAL_TO, maxScore=NaN, scrollId='null', searchHits={0 elements}, aggregations=null}
  • 使用哪个查询?第一个还是第二个?
  • 他们俩:/
  • 我已经更新了我的第二个查询,你可以试试吗?如果它不起作用,您可以分享您的索引映射吗?
  • 它适用于 matchQuery 而不是 termQuery
猜你喜欢
  • 1970-01-01
  • 2014-06-08
  • 2019-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多