diff --git a/docs/changelog/128846.yaml b/docs/changelog/128846.yaml new file mode 100644 index 0000000000000..245dd26142495 --- /dev/null +++ b/docs/changelog/128846.yaml @@ -0,0 +1,5 @@ +pr: 128846 +summary: Generate `IndexOrDocValuesQuery` for term queries in `IpFieldMapper` +area: Search +type: enhancement +issues: [] diff --git a/server/src/main/java/org/elasticsearch/index/mapper/IpFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/IpFieldMapper.java index 8e7cf41ca21b7..d60dc134bd124 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/IpFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/IpFieldMapper.java @@ -347,7 +347,9 @@ public Query termQuery(Object value, @Nullable SearchExecutionContext context) { query = InetAddressPoint.newExactQuery(name(), address); } } - if (isIndexed()) { + if (isIndexed() && hasDocValues()) { + return new IndexOrDocValuesQuery(query, convertToDocValuesQuery(query)); + } else if (isIndexed()) { return query; } else { return convertToDocValuesQuery(query); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/IpFieldTypeTests.java b/server/src/test/java/org/elasticsearch/index/mapper/IpFieldTypeTests.java index 895a81a838a9c..82efc524ade5b 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/IpFieldTypeTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/IpFieldTypeTests.java @@ -56,13 +56,33 @@ public void testTermQuery() { MappedFieldType ft = new IpFieldMapper.IpFieldType("field"); String ip = "2001:db8::2:1"; + Query query = InetAddressPoint.newExactQuery("field", InetAddresses.forString(ip)); + assertEquals(new IndexOrDocValuesQuery(query, convertToDocValuesQuery(query)), ft.termQuery(ip, MOCK_CONTEXT)); + + ip = "192.168.1.7"; + query = InetAddressPoint.newExactQuery("field", InetAddresses.forString(ip)); + assertEquals(new IndexOrDocValuesQuery(query, convertToDocValuesQuery(query)), ft.termQuery(ip, MOCK_CONTEXT)); + + ip = "2001:db8::2:1"; + String prefix = ip + "/64"; + query = InetAddressPoint.newPrefixQuery("field", InetAddresses.forString(ip), 64); + assertEquals(new IndexOrDocValuesQuery(query, convertToDocValuesQuery(query)), ft.termQuery(prefix, MOCK_CONTEXT)); + + ip = "192.168.1.7"; + prefix = ip + "/16"; + query = InetAddressPoint.newPrefixQuery("field", InetAddresses.forString(ip), 16); + assertEquals(new IndexOrDocValuesQuery(query, convertToDocValuesQuery(query)), ft.termQuery(prefix, MOCK_CONTEXT)); + + ft = new IpFieldMapper.IpFieldType("field", true, false); + + ip = "2001:db8::2:1"; assertEquals(InetAddressPoint.newExactQuery("field", InetAddresses.forString(ip)), ft.termQuery(ip, MOCK_CONTEXT)); ip = "192.168.1.7"; assertEquals(InetAddressPoint.newExactQuery("field", InetAddresses.forString(ip)), ft.termQuery(ip, MOCK_CONTEXT)); ip = "2001:db8::2:1"; - String prefix = ip + "/64"; + prefix = ip + "/64"; assertEquals(InetAddressPoint.newPrefixQuery("field", InetAddresses.forString(ip), 64), ft.termQuery(prefix, MOCK_CONTEXT)); ip = "192.168.1.7";