From 8df89f4695cc59a5e096a836036950cf1dcd2283 Mon Sep 17 00:00:00 2001 From: Adrien Grand Date: Thu, 22 Jul 2021 11:00:38 +0200 Subject: [PATCH 1/2] Address recent percolator failures. They are due to changes to `indices.query.bool.max_clause_count` that got pushed in #75297. Closes #75591 Closes #75592 --- .../org/elasticsearch/percolator/CandidateQueryTests.java | 3 +-- .../elasticsearch/percolator/PercolatorFieldMapperTests.java | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/percolator/src/test/java/org/elasticsearch/percolator/CandidateQueryTests.java b/modules/percolator/src/test/java/org/elasticsearch/percolator/CandidateQueryTests.java index 4dbfbd1c67f68..5f8ed6190d546 100644 --- a/modules/percolator/src/test/java/org/elasticsearch/percolator/CandidateQueryTests.java +++ b/modules/percolator/src/test/java/org/elasticsearch/percolator/CandidateQueryTests.java @@ -807,7 +807,6 @@ public void testFunctionScoreQuery() throws Exception { assertEquals(2, topDocs.scoreDocs[1].doc); } - @AwaitsFix(bugUrl = "https://github.com/elastic/elasticsearch/issues/75592") public void testPercolateSmallAndLargeDocument() throws Exception { List docs = new ArrayList<>(); BooleanQuery.Builder builder = new BooleanQuery.Builder(); @@ -872,7 +871,7 @@ public void testPercolateSmallAndLargeDocument() throws Exception { try (Directory directory = new ByteBuffersDirectory()) { try (IndexWriter iw = new IndexWriter(directory, newIndexWriterConfig())) { Document document = new Document(); - for (int i = 0; i < 1024; i++) { + for (int i = 0; i < 4096; i++) { int fieldNumber = 2 + i; document.add(new StringField("field", "value" + fieldNumber, Field.Store.NO)); } diff --git a/modules/percolator/src/test/java/org/elasticsearch/percolator/PercolatorFieldMapperTests.java b/modules/percolator/src/test/java/org/elasticsearch/percolator/PercolatorFieldMapperTests.java index 171cc62b79a4e..d5fae4cd0ccac 100644 --- a/modules/percolator/src/test/java/org/elasticsearch/percolator/PercolatorFieldMapperTests.java +++ b/modules/percolator/src/test/java/org/elasticsearch/percolator/PercolatorFieldMapperTests.java @@ -341,7 +341,7 @@ public void testCreateCandidateQuery() throws Exception { MemoryIndex memoryIndex = new MemoryIndex(false); StringBuilder text = new StringBuilder(); - for (int i = 0; i < 1022; i++) { + for (int i = 0; i < 4094; i++) { text.append(i).append(' '); } memoryIndex.addField("field1", text.toString(), new WhitespaceAnalyzer()); @@ -361,7 +361,7 @@ public void testCreateCandidateQuery() throws Exception { assertFalse(t.v2()); assertEquals(3, t.v1().clauses().size()); TermInSetQuery terms = (TermInSetQuery) t.v1().clauses().get(0).getQuery(); - assertEquals(1023, terms.getTermData().size()); + assertEquals(4095, terms.getTermData().size()); assertThat(t.v1().clauses().get(1).getQuery().toString(), containsString(fieldName + ".range_field: Date: Thu, 22 Jul 2021 11:27:40 +0200 Subject: [PATCH 2/2] iter --- .../percolator/CandidateQueryTests.java | 7 ++- .../PercolatorFieldMapperTests.java | 59 +++++++++++-------- 2 files changed, 39 insertions(+), 27 deletions(-) diff --git a/modules/percolator/src/test/java/org/elasticsearch/percolator/CandidateQueryTests.java b/modules/percolator/src/test/java/org/elasticsearch/percolator/CandidateQueryTests.java index 5f8ed6190d546..7f9c0ef0e62ec 100644 --- a/modules/percolator/src/test/java/org/elasticsearch/percolator/CandidateQueryTests.java +++ b/modules/percolator/src/test/java/org/elasticsearch/percolator/CandidateQueryTests.java @@ -868,10 +868,13 @@ public void testPercolateSmallAndLargeDocument() throws Exception { } // This will trigger using the TermsQuery instead of individual term query clauses in the CoveringQuery: + int origMaxClauseCount = BooleanQuery.getMaxClauseCount(); try (Directory directory = new ByteBuffersDirectory()) { + final int maxClauseCount = 100; + BooleanQuery.setMaxClauseCount(maxClauseCount); try (IndexWriter iw = new IndexWriter(directory, newIndexWriterConfig())) { Document document = new Document(); - for (int i = 0; i < 4096; i++) { + for (int i = 0; i < maxClauseCount; i++) { int fieldNumber = 2 + i; document.add(new StringField("field", "value" + fieldNumber, Field.Store.NO)); } @@ -897,6 +900,8 @@ public void testPercolateSmallAndLargeDocument() throws Exception { assertEquals(1, topDocs.scoreDocs[0].doc); assertEquals(2, topDocs.scoreDocs[1].doc); } + } finally { + BooleanQuery.setMaxClauseCount(origMaxClauseCount); } } diff --git a/modules/percolator/src/test/java/org/elasticsearch/percolator/PercolatorFieldMapperTests.java b/modules/percolator/src/test/java/org/elasticsearch/percolator/PercolatorFieldMapperTests.java index d5fae4cd0ccac..3b2210676cc27 100644 --- a/modules/percolator/src/test/java/org/elasticsearch/percolator/PercolatorFieldMapperTests.java +++ b/modules/percolator/src/test/java/org/elasticsearch/percolator/PercolatorFieldMapperTests.java @@ -337,33 +337,40 @@ public void testExtractTermsAndRanges() throws Exception { public void testCreateCandidateQuery() throws Exception { - addQueryFieldMappings(); - - MemoryIndex memoryIndex = new MemoryIndex(false); - StringBuilder text = new StringBuilder(); - for (int i = 0; i < 4094; i++) { - text.append(i).append(' '); + int origMaxClauseCount = BooleanQuery.getMaxClauseCount(); + try { + final int maxClauseCount = 100; + BooleanQuery.setMaxClauseCount(maxClauseCount); + addQueryFieldMappings(); + + MemoryIndex memoryIndex = new MemoryIndex(false); + StringBuilder text = new StringBuilder(); + for (int i = 0; i < maxClauseCount - 2; i++) { + text.append(i).append(' '); + } + memoryIndex.addField("field1", text.toString(), new WhitespaceAnalyzer()); + memoryIndex.addField(new LongPoint("field2", 10L), new WhitespaceAnalyzer()); + IndexReader indexReader = memoryIndex.createSearcher().getIndexReader(); + + Tuple t = fieldType.createCandidateQuery(indexReader, Version.CURRENT); + assertTrue(t.v2()); + assertEquals(2, t.v1().clauses().size()); + assertThat(t.v1().clauses().get(0).getQuery(), instanceOf(CoveringQuery.class)); + assertThat(t.v1().clauses().get(1).getQuery(), instanceOf(TermQuery.class)); + + // Now push it over the edge, so that it falls back using TermInSetQuery + memoryIndex.addField("field2", "value", new WhitespaceAnalyzer()); + indexReader = memoryIndex.createSearcher().getIndexReader(); + t = fieldType.createCandidateQuery(indexReader, Version.CURRENT); + assertFalse(t.v2()); + assertEquals(3, t.v1().clauses().size()); + TermInSetQuery terms = (TermInSetQuery) t.v1().clauses().get(0).getQuery(); + assertEquals(maxClauseCount - 1, terms.getTermData().size()); + assertThat(t.v1().clauses().get(1).getQuery().toString(), containsString(fieldName + ".range_field: t = fieldType.createCandidateQuery(indexReader, Version.CURRENT); - assertTrue(t.v2()); - assertEquals(2, t.v1().clauses().size()); - assertThat(t.v1().clauses().get(0).getQuery(), instanceOf(CoveringQuery.class)); - assertThat(t.v1().clauses().get(1).getQuery(), instanceOf(TermQuery.class)); - - // Now push it over the edge, so that it falls back using TermInSetQuery - memoryIndex.addField("field2", "value", new WhitespaceAnalyzer()); - indexReader = memoryIndex.createSearcher().getIndexReader(); - t = fieldType.createCandidateQuery(indexReader, Version.CURRENT); - assertFalse(t.v2()); - assertEquals(3, t.v1().clauses().size()); - TermInSetQuery terms = (TermInSetQuery) t.v1().clauses().get(0).getQuery(); - assertEquals(4095, terms.getTermData().size()); - assertThat(t.v1().clauses().get(1).getQuery().toString(), containsString(fieldName + ".range_field: