You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ju...@apache.org on 2022/06/27 08:14:50 UTC

[lucene] branch branch_9x updated: Fix FieldExistsQuery rewrite when all docs have vectors (#986)

This is an automated email from the ASF dual-hosted git repository.

julietibs pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/lucene.git


The following commit(s) were added to refs/heads/branch_9x by this push:
     new f0815ee99bc Fix FieldExistsQuery rewrite when all docs have vectors (#986)
f0815ee99bc is described below

commit f0815ee99bc676bb19fa8871d40fad110700242e
Author: Julie Tibshirani <ju...@apache.org>
AuthorDate: Mon Jun 27 09:59:53 2022 +0200

    Fix FieldExistsQuery rewrite when all docs have vectors (#986)
    
    Before we were checking the number of vectors in the segment against the total
    number of documents in IndexReader. This meant FieldExistsQuery would not
    rewrite to MatchAllDocsQuery when there were multiple segments.
---
 lucene/CHANGES.txt                                          |  2 ++
 .../src/java/org/apache/lucene/search/FieldExistsQuery.java |  2 +-
 .../test/org/apache/lucene/search/TestFieldExistsQuery.java | 13 +++++++++----
 3 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index aa6b3491735..6397b590a22 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -127,6 +127,8 @@ Bug Fixes
 
 * LUCENE-10607: Fix potential integer overflow in maxArcs computions (Tang Donghai)
 
+* GITHUB#986: Fix FieldExistsQuery rewrite when all docs have vectors. (Julie Tibshirani)
+
 Other
 ---------------------
 
diff --git a/lucene/core/src/java/org/apache/lucene/search/FieldExistsQuery.java b/lucene/core/src/java/org/apache/lucene/search/FieldExistsQuery.java
index fa63be63942..959bb8b84ed 100644
--- a/lucene/core/src/java/org/apache/lucene/search/FieldExistsQuery.java
+++ b/lucene/core/src/java/org/apache/lucene/search/FieldExistsQuery.java
@@ -126,7 +126,7 @@ public class FieldExistsQuery extends Query {
           break;
         }
       } else if (fieldInfo.getVectorDimension() != 0) { // the field indexes vectors
-        if (leaf.getVectorValues(field).size() != reader.maxDoc()) {
+        if (leaf.getVectorValues(field).size() != leaf.maxDoc()) {
           allReadersRewritable = false;
           break;
         }
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestFieldExistsQuery.java b/lucene/core/src/test/org/apache/lucene/search/TestFieldExistsQuery.java
index 14dffeea986..593ab075126 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestFieldExistsQuery.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestFieldExistsQuery.java
@@ -629,13 +629,18 @@ public class TestFieldExistsQuery extends LuceneTestCase {
   public void testKnnVectorAllDocsHaveField() throws IOException {
     try (Directory dir = newDirectory();
         RandomIndexWriter iw = new RandomIndexWriter(random(), dir)) {
-      Document doc = new Document();
-      doc.add(new KnnVectorField("vector", randomVector(3)));
-      iw.addDocument(doc);
+      for (int i = 0; i < 100; ++i) {
+        Document doc = new Document();
+        doc.add(new KnnVectorField("vector", randomVector(5)));
+        iw.addDocument(doc);
+      }
       iw.commit();
+
       try (IndexReader reader = iw.getReader()) {
         IndexSearcher searcher = newSearcher(reader);
-        assertEquals(1, searcher.count(new FieldExistsQuery("vector")));
+        Query query = new FieldExistsQuery("vector");
+        assertTrue(searcher.rewrite(query) instanceof MatchAllDocsQuery);
+        assertEquals(100, searcher.count(query));
       }
     }
   }