elasticsearch,aggregation,Java,elasticsearch,Aggregation" /> elasticsearch,aggregation,Java,elasticsearch,Aggregation" />

Java QueryBuilders rangeQuery具有空日期或空值

Java QueryBuilders rangeQuery具有空日期或空值,java,elasticsearch,aggregation,Java,elasticsearch,Aggregation,正在尝试为范围查询找到解决方案 使用QueryBuilders.rangeQuery 问题: DateFrom可以为null或高于今天 DateTill可以为空或小于今天 quantyti剩余值可以为null,也可以大于0 只有这样,文档才能出现在我试图解决这个问题的搜索结果中 publishedFilter.should(QueryBuilders.boolQuery() .mustNot(QueryBuilders.existsQuery(S

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

问题: DateFrom可以为null或高于今天 DateTill可以为空或小于今天 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


有什么想法吗?

我会这样做:

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

是的,这是一个想法,但在这种情况下,它不被需求所接受,因为 如果我有一个对象叫他
searchDto
在场景中必须是可搜索的数据

 searchDto.setQuantityRemaining(0);

 searchDto.setQuantityRemaining(1);
        searchDto.setDateTimeRange(DateTimeRangeDto.builder()
            .dateTimeFrom(null)
            .dateTimeTill(null)
            .build());

        searchDto.setQuantityRemaining(null);
        searchDto.setDateTimeRange(DateTimeRangeDto.builder()
            .dateTimeFrom(null)
            .dateTimeTill(null)
            .build());

        searchDto.setQuantityRemaining(null);
        searchDto.setDateTimeRange(DateTimeRangeDto.builder()
            .dateTimeFrom(OffsetDateTime.now())
            .dateTimeTill(null)
            .build());

        searchDto.setQuantityRemaining(2);
        searchDto.setDateTimeRange(DateTimeRangeDto.builder()
            .dateTimeFrom(OffsetDateTime.now())
            .dateTimeTill(OffsetDateTime.now().plusHours(1))
            .build());



        // and not searchable

        searchDto.setQuantityRemaining(0);
        searchDto.setDateTimeRange(DateTimeRangeDto.builder()
            .dateTimeFrom(OffsetDateTime.now().plusHours(1))
            .dateTimeTill(OffsetDateTime.now())
            .build());