diff --git a/docs/changelog/132511.yaml b/docs/changelog/132511.yaml new file mode 100644 index 0000000000000..182ae4fda98c2 --- /dev/null +++ b/docs/changelog/132511.yaml @@ -0,0 +1,5 @@ +pr: 132511 +summary: Handle special regex cases for version fields +area: Search +type: bug +issues: [] diff --git a/x-pack/plugin/mapper-version/src/main/java/org/elasticsearch/xpack/versionfield/VersionStringFieldMapper.java b/x-pack/plugin/mapper-version/src/main/java/org/elasticsearch/xpack/versionfield/VersionStringFieldMapper.java index d0f2de17cadd1..f4031601022da 100644 --- a/x-pack/plugin/mapper-version/src/main/java/org/elasticsearch/xpack/versionfield/VersionStringFieldMapper.java +++ b/x-pack/plugin/mapper-version/src/main/java/org/elasticsearch/xpack/versionfield/VersionStringFieldMapper.java @@ -198,6 +198,17 @@ protected TermsEnum getTermsEnum(Terms terms, AttributeSource atts) throws IOExc @Override protected AcceptStatus accept(BytesRef term) throws IOException { BytesRef decoded = VersionEncoder.decodeVersion(term); + if (compiled.runAutomaton == null) { + return switch (compiled.type) { + case SINGLE -> decoded.equals(compiled.term) ? AcceptStatus.YES : AcceptStatus.NO; + case ALL -> AcceptStatus.YES; + case NONE -> AcceptStatus.NO; + default -> { + assert false : "Unexpected automaton type: " + compiled.type; + yield AcceptStatus.NO; + } + }; + } boolean accepted = compiled.runAutomaton.run(decoded.bytes, decoded.offset, decoded.length); if (accepted) { return AcceptStatus.YES; diff --git a/x-pack/plugin/mapper-version/src/test/java/org/elasticsearch/xpack/versionfield/VersionStringFieldTests.java b/x-pack/plugin/mapper-version/src/test/java/org/elasticsearch/xpack/versionfield/VersionStringFieldTests.java index c89d1f8493b6b..dd9ef2fb81e4e 100644 --- a/x-pack/plugin/mapper-version/src/test/java/org/elasticsearch/xpack/versionfield/VersionStringFieldTests.java +++ b/x-pack/plugin/mapper-version/src/test/java/org/elasticsearch/xpack/versionfield/VersionStringFieldTests.java @@ -216,6 +216,35 @@ public void testRegexQuery() throws Exception { assertEquals("2.1.0-alpha.beta", response.getHits().getHits()[1].getSourceAsMap().get("version")); } ); + + assertResponse( + client().prepareSearch(indexName).setQuery(QueryBuilders.regexpQuery("version", ".*").caseInsensitive(true)), + response -> { + assertEquals(5, response.getHits().getTotalHits().value()); + } + ); + + assertResponse( + client().prepareSearch(indexName).setQuery(QueryBuilders.regexpQuery("version", "2\\.1\\.0").caseInsensitive(false)), + response -> { + assertEquals(1, response.getHits().getTotalHits().value()); + } + ); + + assertResponse( + client().prepareSearch(indexName).setQuery(QueryBuilders.regexpQuery("version", "2\\.1\\.1").caseInsensitive(false)), + response -> { + assertEquals(0, response.getHits().getTotalHits().value()); + } + ); + + // empty regex should not match anything + assertResponse( + client().prepareSearch(indexName).setQuery(QueryBuilders.regexpQuery("version", "").caseInsensitive(false)), + response -> { + assertEquals(0, response.getHits().getTotalHits().value()); + } + ); } public void testFuzzyQuery() throws Exception {