Skip to content

Commit 01db875

Browse files
committed
fix dv only range search
add filter Signed-off-by: mikhail-khludnev <[email protected]>
1 parent 26ff736 commit 01db875

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

server/src/main/java/org/opensearch/index/mapper/IpFieldMapper.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,14 @@ public Query termQuery(Object value, @Nullable QueryShardContext context) {
265265
String term = value.toString();
266266
if (term.contains("/")) {
267267
final Tuple<InetAddress, Integer> cidr = InetAddresses.parseCidr(term);
268-
return InetAddressPoint.newPrefixQuery(name(), cidr.v1(), cidr.v2());
268+
PointRangeQuery pointsRange = (PointRangeQuery) InetAddressPoint.newPrefixQuery(name(), cidr.v1(), cidr.v2());
269+
return SortedSetDocValuesField.newSlowRangeQuery(
270+
name(),
271+
new BytesRef(pointsRange.getLowerPoint()),
272+
new BytesRef(pointsRange.getUpperPoint()),
273+
true,
274+
true
275+
);
269276
}
270277
return SortedSetDocValuesField.newSlowExactQuery(name(), new BytesRef(((PointRangeQuery) query).getLowerPoint()));
271278
}

server/src/test/java/org/opensearch/search/SearchIpFieldTermsTests.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@
1414
import org.opensearch.common.xcontent.XContentFactory;
1515
import org.opensearch.core.xcontent.XContentBuilder;
1616
import org.opensearch.index.query.QueryBuilders;
17+
import org.opensearch.index.query.TermsQueryBuilder;
1718
import org.opensearch.test.OpenSearchSingleNodeTestCase;
1819
import org.hamcrest.MatcherAssert;
1920

2021
import java.io.IOException;
2122
import java.net.InetAddress;
2223
import java.util.ArrayList;
24+
import java.util.Collection;
2325
import java.util.List;
2426
import java.util.Map;
2527
import java.util.Objects;
@@ -90,8 +92,19 @@ public void testMassive() throws Exception {
9092
}
9193

9294
bulkRequestBuilder.setRefreshPolicy(IMMEDIATE).get();
93-
SearchResponse result = client().prepareSearch(defaultIndexName).setQuery(QueryBuilders.termsQuery("addr", toQuery)).get();
94-
MatcherAssert.assertThat(Objects.requireNonNull(result.getHits().getTotalHits()).value, equalTo((long) cidrs + ips + addMatches));
95+
long expectedMatches = (long) cidrs + ips + addMatches;
96+
for (String field : List.of("addr", "addr.idx", "addr.dv")) {
97+
assertTermsHitCount(field, toQuery, expectedMatches);
98+
}
99+
}
100+
101+
private void assertTermsHitCount(String field, Collection<String> toQuery, long expectedMatches) {
102+
TermsQueryBuilder ipTerms = QueryBuilders.termsQuery(field, new ArrayList<>(toQuery));
103+
SearchResponse result = client().prepareSearch(defaultIndexName)
104+
.setQuery(QueryBuilders.boolQuery().must(ipTerms).filter(QueryBuilders.termsQuery("dummy_filter", "a", "b")))
105+
.get();
106+
long hitsFound = Objects.requireNonNull(result.getHits().getTotalHits()).value;
107+
MatcherAssert.assertThat(field, hitsFound, equalTo(expectedMatches));
95108
}
96109

97110
// Converts an IP string (either IPv4 or IPv6) to a byte array
@@ -169,6 +182,9 @@ private XContentBuilder createMapping() throws IOException {
169182
.endObject()
170183
.endObject()
171184
.endObject()
185+
.startObject("dummy_filter")
186+
.field("type", "keyword")
187+
.endObject()
172188
.endObject()
173189
.endObject();
174190
}

0 commit comments

Comments
 (0)