Skip to content

Commit b7c7ca8

Browse files
committed
Fix IAE on cross_fields query introduced in 7.0.1 (#41938)
If the max doc in the index is greater than the minimum total term frequency among the requested fields we need to adjust max doc to be equal to the min ttf. This was removed by mistake when fixing #41125. Closes #41934
1 parent c0d6791 commit b7c7ca8

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

server/src/main/java/org/apache/lucene/queries/BlendedTermQuery.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,9 @@ protected void blend(final TermStates[] contexts, int maxDoc, IndexReader reader
118118
// otherwise the statistics don't match
119119
minSumTTF = Math.min(minSumTTF, reader.getSumTotalTermFreq(terms[i].field()));
120120
}
121-
121+
}
122+
if (maxDoc > minSumTTF) {
123+
maxDoc = (int)minSumTTF;
122124
}
123125
if (max == 0) {
124126
return; // we are done that term doesn't exist at all

server/src/test/java/org/apache/lucene/queries/BlendedTermQueryTests.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,4 +227,34 @@ public void testExtractTerms() throws IOException {
227227
assertThat(extracted.size(), equalTo(terms.size()));
228228
assertThat(extracted, containsInAnyOrder(terms.toArray(new Term[0])));
229229
}
230+
231+
public void testMinTTF() throws IOException {
232+
Directory dir = newDirectory();
233+
IndexWriter w = new IndexWriter(dir, newIndexWriterConfig(new MockAnalyzer(random())));
234+
FieldType ft = new FieldType(TextField.TYPE_NOT_STORED);
235+
ft.freeze();
236+
237+
for (int i = 0; i < 10; i++) {
238+
Document d = new Document();
239+
d.add(new TextField("id", Integer.toString(i), Field.Store.YES));
240+
d.add(new Field("dense", "foo foo foo", ft));
241+
if (i % 10 == 0) {
242+
d.add(new Field("sparse", "foo", ft));
243+
}
244+
w.addDocument(d);
245+
}
246+
w.commit();
247+
DirectoryReader reader = DirectoryReader.open(w);
248+
IndexSearcher searcher = setSimilarity(newSearcher(reader));
249+
{
250+
String[] fields = new String[]{"dense", "sparse"};
251+
Query query = BlendedTermQuery.dismaxBlendedQuery(toTerms(fields, "foo"), 0.1f);
252+
TopDocs search = searcher.search(query, 10);
253+
ScoreDoc[] scoreDocs = search.scoreDocs;
254+
assertEquals(Integer.toString(0), reader.document(scoreDocs[0].doc).getField("id").stringValue());
255+
}
256+
reader.close();
257+
w.close();
258+
dir.close();
259+
}
230260
}

0 commit comments

Comments
 (0)