0

Я пытаюсь извлечь документы, которые больше или меньше указанной даты.Spring Data Elasticsearch для извлечения документов между двумя датами генерирует неправильный запрос

Для этой цели я использую следующий searchQuery.

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

Запрос, сформированный из вышеуказанного построителя запросов, выглядит следующим образом.

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

Даже когда я использовать функции GT и светопроницаемости rangequery запрос генерируется в от и до.

Какое решение можно создать таким образом.

{ 
    "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 Elicsearch, будут полезны.

ответ

0

Ваш запрос не вернет никаких результатов, так как вы ищете даты, которые строго больше и строго ниже той же даты. Вы должны использовать gte и lte вместо:

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

official parameters из range запроса являются gt, gte, lt и lte.

Параметры from, to, include_lower и include_upper старые устаревшие параметры, которым RangeQueryBuilder все еще использует, но может (и будет) быть удалены в любое время.

Просто знайте, что:

  • from + include_lower: false эквивалентно gt
  • from + include_lower: true эквивалентно gte
  • to + include_upper: false эквивалентно lt
  • to + include_upper: true эквивалентно lte
+0

Спасибо за ответ. Я пробовал этот запрос, но не возвращал данные с сервера. Это запрос ** QueryBuilder qb = QueryBuilders.boolQuery(). Must (QueryBuilders.rangeQuery ("recedate"). Gte ("2015-06-25T00: 00: 00"). Lte ("2015-07-25T00: 00:00 ")) ** – sumanth

+0

Можете ли вы показать один документ, который, по вашему мнению, должен быть возвращен? – Val

+0

Это пример JSON { "_index": "Тест", "_type": "Тест", "_id": "1015", "_version": 1, "_SCORE": 1, "_source": { "id": "1015", "createdDate": "2015-07-16T00: 00: 00.000Z ", " receiptnumber ":" 10150000187831 ", " paymentmode ":" cash ", " receiptdate ":" 2015-07-16T00: 00: 00.000Z ", " installmentfrom ":" 2015-04-01 », "installmentto": "2015-09-30", "reductionamount": нулевой, "receiptcreator": ""} } – sumanth