Spring Data Elasticsearch在两个日期之间获取文档会生成错误的查询

时间:2016-10-03 05:49:02

标签: spring elasticsearch spring-data-elasticsearch elasticsearch-query

我正在尝试获取大于或小于指定日期的文档。

我正在使用下面的searchQuery来实现此目的。

QueryBuilder queryBuilder = QueryBuilders.boolQuery()  
              .must(QueryBuilders.rangeQuery("date") 
                    .gt("2015-06-25T00:00:00")  
                    .lt("2015-06-25T00:00:00"));

从上面的querybuilder生成的查询是这样的。

{  
  "bool" : {  
    "must" : [ {  
      "range" : {  
        "date" : {  
          "from" : "2015-06-25T00:00:00",  
          "to" : "2015-06-25T00:00:00",  
          "include_lower" : false,  
          "include_upper" : false  
        }  
      }  
    }  
    } ]  
  }

即使我使用函数 gt和lt of rangequery ,查询也会生成为 from和to

解决方案是什么,以便可以像这样生成查询。

    {  
  "bool" : {  
    "must" : [ {  
      "range" : {  
        "date" : {  
          "gt" : "2015-06-25T00:00:00",  
          "lt" : "2015-06-25T00:00:00",  
          "include_lower" : false,  
          "include_upper" : false  
        }  
      }  
    }  
    } ]  
  }  

这是我写的测试课。

   @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { ElasticSearchConfiguration.class }, loader = AnnotationConfigContextLoader.class)
public class ElasticSearchTest {

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    @Autowired
    private Client client;

    @Test
    public void testAggregation(){

    QueryBuilder querybuilder = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("receiptdate").gte("2015-06-25T00:00:00").lte ("2015-07-25T00:00:00")));

    final SearchQuery searchQuery = new NativeSearchQueryBuilder()
                    .withQuery(qb)
                    .build();


  final List<Test> records = elasticsearchTemplate.queryForList(searchQuery, Test.class);
    }
}

有关如何在Spring Data Elasticsearch中实现此功能的任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:0)

您的查询不会返回任何结果,因为您正在查找严格更高且严格低于同一日期的日期。您需要使用gtelte代替:

QueryBuilder queryBuilder = QueryBuilders.boolQuery()  
          .must(QueryBuilders.rangeQuery("date") 
                .gte("2015-06-25T00:00:00")  
                .lte("2015-06-25T00:00:00"));

range查询的official parametersgtgteltlte

fromtoinclude_lowerinclude_upper参数是旧的弃用参数,RangeQueryBuilder仍在使用但可以(并且将会)随时删除。

只知道:

  • from + include_lower: false相当于gt
  • from + include_lower: true相当于gte
  • to + include_upper: false相当于lt
  • to + include_upper: true相当于lte