Skip to content

Commit 01bd990

Browse files
author
Christoph Büscher
authored
Handle range query edge case (#63397) (#63984)
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
1 parent bac6bd0 commit 01bd990

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed

server/src/internalClusterTest/java/org/elasticsearch/search/simple/SimpleSearchIT.java

+45
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,51 @@ public void testSimpleDateRange() throws Exception {
225225
assertHitCount(searchResponse, 2L);
226226
}
227227

228+
public void testRangeQueryKeyword() throws Exception {
229+
createIndex("test");
230+
231+
client().admin().indices().preparePutMapping("test").setType("_doc").setSource("field", "type=keyword").get();
232+
233+
client().prepareIndex("test", "_doc", "0").setSource("field", "").get();
234+
client().prepareIndex("test", "_doc", "1").setSource("field", "A").get();
235+
client().prepareIndex("test", "_doc", "2").setSource("field", "B").get();
236+
client().prepareIndex("test", "_doc", "3").setSource("field", "C").get();
237+
ensureGreen();
238+
refresh();
239+
240+
SearchResponse searchResponse = client().prepareSearch("test").setQuery(QueryBuilders.rangeQuery("field").gte("A").lte("B")).get();
241+
assertNoFailures(searchResponse);
242+
assertHitCount(searchResponse, 2L);
243+
244+
searchResponse = client().prepareSearch("test").setQuery(QueryBuilders.rangeQuery("field").gt("A").lte("B")).get();
245+
assertNoFailures(searchResponse);
246+
assertHitCount(searchResponse, 1L);
247+
248+
searchResponse = client().prepareSearch("test").setQuery(QueryBuilders.rangeQuery("field").gte("A").lt("B")).get();
249+
assertNoFailures(searchResponse);
250+
assertHitCount(searchResponse, 1L);
251+
252+
searchResponse = client().prepareSearch("test").setQuery(QueryBuilders.rangeQuery("field").gte(null).lt("C")).get();
253+
assertNoFailures(searchResponse);
254+
assertHitCount(searchResponse, 3L);
255+
256+
searchResponse = client().prepareSearch("test").setQuery(QueryBuilders.rangeQuery("field").gte("B").lt(null)).get();
257+
assertNoFailures(searchResponse);
258+
assertHitCount(searchResponse, 2L);
259+
260+
searchResponse = client().prepareSearch("test").setQuery(QueryBuilders.rangeQuery("field").gt(null).lt(null)).get();
261+
assertNoFailures(searchResponse);
262+
assertHitCount(searchResponse, 4L);
263+
264+
searchResponse = client().prepareSearch("test").setQuery(QueryBuilders.rangeQuery("field").gte("").lt(null)).get();
265+
assertNoFailures(searchResponse);
266+
assertHitCount(searchResponse, 4L);
267+
268+
searchResponse = client().prepareSearch("test").setQuery(QueryBuilders.rangeQuery("field").gt("").lt(null)).get();
269+
assertNoFailures(searchResponse);
270+
assertHitCount(searchResponse, 3L);
271+
}
272+
228273
public void testSimpleTerminateAfterCount() throws Exception {
229274
prepareCreate("test").setSettings(Settings.builder().put(SETTING_NUMBER_OF_SHARDS, 1).put(SETTING_NUMBER_OF_REPLICAS, 0)).get();
230275
ensureGreen();

0 commit comments

Comments
 (0)