首页 > 解决方案 > 具有空日期或值的 QueryBuilders rangeQuery

问题描述

尝试使用 QueryBuilders.rangeQuery 找到范围查询的解决方案

问题:DateFrom 可以为 null 或大于今天 DateTill 可以为 null 或小于今天 quantyti 剩余可以为 null 或值可以大于 0

只有这样文件才能出现在搜索结果中我试图解决这个问题

         publishedFilter.should(QueryBuilders.boolQuery()
                .mustNot(QueryBuilders.existsQuery(SearchAble.QUANTITY_REMAINING)))
            .should(QueryBuilders.rangeQuery(SearchAble.QUANTITY_REMAINING).gte(1))
            .minimumShouldMatch(1);

        publishedFilter.should(QueryBuilders.boolQuery()
            .mustNot(QueryBuilders.existsQuery(SearchAble.DATE_TIME_FROM))
            .should(QueryBuilders.rangeQuery(SearchAble.DATE_TIME_FROM).lte(time))
        );

        publishedFilter.should(QueryBuilders.boolQuery()
            .mustNot(QueryBuilders.existsQuery(SearchAble.DATE_TIME_TILL))
            .should(QueryBuilders.rangeQuery(SearchAble.DATE_TIME_TILL).gte(time))
        );

但此解决方案仅适用于 quantyti 剩余而不是 dateFrom 和 dateTill

有任何想法吗 ?

标签: javaelasticsearchaggregation

解决方案


我会这样做:

    // at least one of the OR conditions must match
    publishedFilter.minimumShouldMatch(1);

    // OR condition for Quantity
    publishedFilter.should(QueryBuilders.boolQuery()
        .should(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery(SearchAble.QUANTITY_REMAINING)))
        .should(QueryBuilders.rangeQuery(SearchAble.QUANTITY_REMAINING).gte(1))
    );

    // OR condition for Date From
    publishedFilter.should(QueryBuilders.boolQuery()
        .should(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery(SearchAble.DATE_TIME_FROM)))
        .should(QueryBuilders.rangeQuery(SearchAble.DATE_TIME_FROM).lte(time))
    );

    // OR condition for Date Till
    publishedFilter.should(QueryBuilders.boolQuery()
        .should(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery(SearchAble. DATE_TIME_TILL)))
        .should(QueryBuilders.rangeQuery(SearchAble. DATE_TIME_TILL).gte(time))
    );

推荐阅读