Skip to content

Commit

Permalink
Handle range query edge case (#63397)
Browse files Browse the repository at this point in the history
Currently when searching with an empty string as lower bound for a range query
on text-based fields we return all documents when 'gte' is used (including the
lower bound) but no documents when 'gt' is used. This might seem
counterintuitive since every value should be greate than the empty string. 
The bug has been fixed in Lucene and this PR adds a test for assuring we observe
the fixed behaviour on searches now.

Closes #63386
  • Loading branch information
Christoph Büscher authored Oct 21, 2020
1 parent 26d5c7c commit d11e2d2
Showing 1 changed file with 45 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,51 @@ public void testSimpleDateRange() throws Exception {
assertHitCount(searchResponse, 2L);
}

public void testRangeQueryKeyword() throws Exception {
createIndex("test");

client().admin().indices().preparePutMapping("test").setSource("field", "type=keyword").get();

client().prepareIndex("test").setId("0").setSource("field", "").get();
client().prepareIndex("test").setId("1").setSource("field", "A").get();
client().prepareIndex("test").setId("2").setSource("field", "B").get();
client().prepareIndex("test").setId("3").setSource("field", "C").get();
ensureGreen();
refresh();

SearchResponse searchResponse = client().prepareSearch("test").setQuery(QueryBuilders.rangeQuery("field").gte("A").lte("B")).get();
assertNoFailures(searchResponse);
assertHitCount(searchResponse, 2L);

searchResponse = client().prepareSearch("test").setQuery(QueryBuilders.rangeQuery("field").gt("A").lte("B")).get();
assertNoFailures(searchResponse);
assertHitCount(searchResponse, 1L);

searchResponse = client().prepareSearch("test").setQuery(QueryBuilders.rangeQuery("field").gte("A").lt("B")).get();
assertNoFailures(searchResponse);
assertHitCount(searchResponse, 1L);

searchResponse = client().prepareSearch("test").setQuery(QueryBuilders.rangeQuery("field").gte(null).lt("C")).get();
assertNoFailures(searchResponse);
assertHitCount(searchResponse, 3L);

searchResponse = client().prepareSearch("test").setQuery(QueryBuilders.rangeQuery("field").gte("B").lt(null)).get();
assertNoFailures(searchResponse);
assertHitCount(searchResponse, 2L);

searchResponse = client().prepareSearch("test").setQuery(QueryBuilders.rangeQuery("field").gt(null).lt(null)).get();
assertNoFailures(searchResponse);
assertHitCount(searchResponse, 4L);

searchResponse = client().prepareSearch("test").setQuery(QueryBuilders.rangeQuery("field").gte("").lt(null)).get();
assertNoFailures(searchResponse);
assertHitCount(searchResponse, 4L);

searchResponse = client().prepareSearch("test").setQuery(QueryBuilders.rangeQuery("field").gt("").lt(null)).get();
assertNoFailures(searchResponse);
assertHitCount(searchResponse, 3L);
}

public void testSimpleTerminateAfterCount() throws Exception {
prepareCreate("test").setSettings(Settings.builder().put(SETTING_NUMBER_OF_SHARDS, 1).put(SETTING_NUMBER_OF_REPLICAS, 0)).get();
ensureGreen();
Expand Down

0 comments on commit d11e2d2

Please sign in to comment.