From f7ec8846d5ca3b3065377ab10f33ebaca88ddf05 Mon Sep 17 00:00:00 2001 From: Alan Woodward Date: Mon, 6 Jan 2020 16:04:52 +0000 Subject: [PATCH 1/2] Correctly handle MSM for nested disjunctions --- .../percolator/QueryAnalyzer.java | 6 ++- .../percolator/QueryAnalyzerTests.java | 37 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/modules/percolator/src/main/java/org/elasticsearch/percolator/QueryAnalyzer.java b/modules/percolator/src/main/java/org/elasticsearch/percolator/QueryAnalyzer.java index f08600cdfd0e9..39b860c7d0ce1 100644 --- a/modules/percolator/src/main/java/org/elasticsearch/percolator/QueryAnalyzer.java +++ b/modules/percolator/src/main/java/org/elasticsearch/percolator/QueryAnalyzer.java @@ -126,7 +126,11 @@ public String toString() { Result getResult() { List partialResults = new ArrayList<>(); if (terms.size() > 0) { - partialResults.add(conjunction ? handleConjunction(terms) : handleDisjunction(terms, minimumShouldMatch)); + if (conjunction) { + partialResults.add(handleConjunction(terms)); + } else { + partialResults.addAll(terms); + } } if (children.isEmpty() == false) { List childResults = children.stream().map(ResultBuilder::getResult).collect(Collectors.toList()); diff --git a/modules/percolator/src/test/java/org/elasticsearch/percolator/QueryAnalyzerTests.java b/modules/percolator/src/test/java/org/elasticsearch/percolator/QueryAnalyzerTests.java index 1c00d0555b41a..adde835deb104 100644 --- a/modules/percolator/src/test/java/org/elasticsearch/percolator/QueryAnalyzerTests.java +++ b/modules/percolator/src/test/java/org/elasticsearch/percolator/QueryAnalyzerTests.java @@ -1209,6 +1209,43 @@ public void testIntervalQueries() { assertTermsEqual(result.extractions, new Term("field", "a")); } + public void testRangeAndTermWithNestedMSM() { + + Query q1 = new BooleanQuery.Builder() + .add(new TermQuery(new Term("f", "v3")), Occur.SHOULD) + .add(new BooleanQuery.Builder() + .add(new TermQuery(new Term("f", "n1")), Occur.SHOULD) + .build(), Occur.SHOULD) + .add(new TermQuery(new Term("f", "v4")), Occur.SHOULD) + .setMinimumNumberShouldMatch(2) + .build(); + + Result r1 = analyze(q1, Version.CURRENT); + assertEquals(2, r1.minimumShouldMatch); + assertThat(r1.extractions, hasSize(3)); + assertFalse(r1.matchAllDocs); + assertTrue(r1.verified); + + Query q = new BooleanQuery.Builder() + .add(IntPoint.newRangeQuery("i", 0, 10), Occur.FILTER) + .add(new TermQuery(new Term("f", "v1")), Occur.MUST) + .add(new TermQuery(new Term("f", "v2")), Occur.MUST) + .add(IntPoint.newRangeQuery("i", 2, 20), Occur.FILTER) + .add(new TermQuery(new Term("f", "v3")), Occur.SHOULD) + .add(new BooleanQuery.Builder() + .add(new TermQuery(new Term("f", "n1")), Occur.SHOULD) + .build(), Occur.SHOULD) + .add(new TermQuery(new Term("f", "v4")), Occur.SHOULD) + .setMinimumNumberShouldMatch(2) + .build(); + + Result r = analyze(q, Version.CURRENT); + assertThat(r.minimumShouldMatch, equalTo(5)); + assertThat(r.extractions, hasSize(7)); + assertFalse(r.matchAllDocs); + assertFalse(r.verified); + } + public void testCombinedRangeAndTermWithMinimumShouldMatch() { Query disj = new BooleanQuery.Builder() From 8b5877f81c82b79f55c3635d07407bb0184a752d Mon Sep 17 00:00:00 2001 From: Alan Woodward Date: Mon, 6 Jan 2020 16:15:02 +0000 Subject: [PATCH 2/2] Simplify logic - we can handle conjunctions like this as well --- .../java/org/elasticsearch/percolator/QueryAnalyzer.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/modules/percolator/src/main/java/org/elasticsearch/percolator/QueryAnalyzer.java b/modules/percolator/src/main/java/org/elasticsearch/percolator/QueryAnalyzer.java index 39b860c7d0ce1..800706b74b9d3 100644 --- a/modules/percolator/src/main/java/org/elasticsearch/percolator/QueryAnalyzer.java +++ b/modules/percolator/src/main/java/org/elasticsearch/percolator/QueryAnalyzer.java @@ -126,11 +126,7 @@ public String toString() { Result getResult() { List partialResults = new ArrayList<>(); if (terms.size() > 0) { - if (conjunction) { - partialResults.add(handleConjunction(terms)); - } else { - partialResults.addAll(terms); - } + partialResults.addAll(terms); } if (children.isEmpty() == false) { List childResults = children.stream().map(ResultBuilder::getResult).collect(Collectors.toList());