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

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

commit 7aaf2e8d3a9d77330a0a3f1621f5f57289fc6cc4
Author: linslee75 <[email protected]>
AuthorDate: Fri Aug 7 14:11:15 2026 +0800

    SOLR-18329: DenseVectorField support existence queries (#4700)
    
    (cherry picked from commit 3c9fcc1ebf33ed337fcd100e125532bb8eff6a54)
---
 .../SOLR-18329-densevector-existence-queries.yml   |  8 +++++
 .../org/apache/solr/schema/DenseVectorField.java   | 14 ++++++++-
 .../apache/solr/schema/DenseVectorFieldTest.java   | 34 +++++++++++++++++-----
 .../query-guide/pages/dense-vector-search.adoc     |  4 ++-
 4 files changed, 50 insertions(+), 10 deletions(-)

diff --git a/changelog/unreleased/SOLR-18329-densevector-existence-queries.yml 
b/changelog/unreleased/SOLR-18329-densevector-existence-queries.yml
new file mode 100644
index 00000000000..e4ad24480d1
--- /dev/null
+++ b/changelog/unreleased/SOLR-18329-densevector-existence-queries.yml
@@ -0,0 +1,8 @@
+title: DenseVectorField now supports existence queries (field:* / [* TO *])
+type: added
+authors:
+  - name: Li Enlai
+    nick: linslee75
+links:
+  - name: SOLR-18329
+    url: https://issues.apache.org/jira/browse/SOLR-18329
diff --git a/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java 
b/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java
index f331d391cdf..c6607d0556f 100644
--- a/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java
+++ b/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java
@@ -36,6 +36,7 @@ import org.apache.lucene.index.VectorSimilarityFunction;
 import org.apache.lucene.queries.function.ValueSource;
 import org.apache.lucene.queries.function.valuesource.ByteKnnVectorFieldSource;
 import 
org.apache.lucene.queries.function.valuesource.FloatKnnVectorFieldSource;
+import org.apache.lucene.search.FieldExistsQuery;
 import org.apache.lucene.search.KnnByteVectorQuery;
 import org.apache.lucene.search.KnnFloatVectorQuery;
 import org.apache.lucene.search.Query;
@@ -379,6 +380,11 @@ public class DenseVectorField extends FloatPointField {
     }
   }
 
+  @Override
+  public Query getExistenceQuery(QParser parser, SchemaField field) {
+    return new FieldExistsQuery(field.getName());
+  }
+
   /**
    * Not Supported. Please use the {!knn} query parser to run K nearest 
neighbors search queries.
    */
@@ -389,7 +395,10 @@ public class DenseVectorField extends FloatPointField {
         "Field Queries are not supported for Dense Vector fields. Please use 
the {!knn} query parser to run K nearest neighbors search queries.");
   }
 
-  /** Not Supported */
+  /**
+   * Unbounded ranges ({@code [* TO *]}) are treated as existence queries. 
Bounded range queries are
+   * not supported.
+   */
   @Override
   public Query getRangeQuery(
       QParser parser,
@@ -398,6 +407,9 @@ public class DenseVectorField extends FloatPointField {
       String part2,
       boolean minInclusive,
       boolean maxInclusive) {
+    if (part1 == null && part2 == null) {
+      return getExistenceQuery(parser, field);
+    }
     throw new SolrException(
         SolrException.ErrorCode.BAD_REQUEST,
         "Range Queries are not supported for Dense Vector fields. Please use 
the {!knn} query parser to run K nearest neighbors search queries.");
diff --git 
a/solr/core/src/test/org/apache/solr/schema/DenseVectorFieldTest.java 
b/solr/core/src/test/org/apache/solr/schema/DenseVectorFieldTest.java
index c777ff43fc5..3ee93ae369e 100644
--- a/solr/core/src/test/org/apache/solr/schema/DenseVectorFieldTest.java
+++ b/solr/core/src/test/org/apache/solr/schema/DenseVectorFieldTest.java
@@ -529,18 +529,36 @@ public class DenseVectorFieldTest extends 
AbstractBadConfigTestBase {
     }
   }
 
-  /** Not Supported */
   @Test
-  public void query_existenceSearch_shouldThrowException() throws Exception {
+  public void query_existenceSearch_shouldMatchDocumentsWithVector() throws 
Exception {
     try {
       initCore("solrconfig-basic.xml", "schema-densevector.xml");
 
-      assertQEx(
-          "Running Existence queries on a dense vector field should raise an 
Exception",
-          "Range Queries are not supported for Dense Vector fields."
-              + " Please use the {!knn} query parser to run K nearest 
neighbors search queries.",
-          req("q", "vector:[* TO *]", "fl", "vector"),
-          SolrException.ErrorCode.BAD_REQUEST);
+      SolrInputDocument doc1 = new SolrInputDocument();
+      doc1.addField("id", "1");
+      doc1.addField("vector", List.of(1.0f, 2.0f, 3.0f, 4.0f));
+      assertU(adoc(doc1));
+
+      SolrInputDocument doc2 = new SolrInputDocument();
+      doc2.addField("id", "2");
+      assertU(adoc(doc2));
+
+      assertU(commit());
+
+      assertJQ(
+          req("q", "vector:[* TO *]", "fl", "id", "sort", "id asc"),
+          "/response/numFound==1",
+          "/response/docs/[0]/id=='1'");
+
+      assertJQ(
+          req("q", "vector:*", "fl", "id", "sort", "id asc"),
+          "/response/numFound==1",
+          "/response/docs/[0]/id=='1'");
+
+      assertJQ(
+          req("q", "-vector:*", "fl", "id", "sort", "id asc"),
+          "/response/numFound==1",
+          "/response/docs/[0]/id=='2'");
     } finally {
       deleteCore();
     }
diff --git 
a/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc 
b/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc
index 90eb122025f..8562228aec0 100644
--- a/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc
+++ b/solr/solr-ref-guide/modules/query-guide/pages/dense-vector-search.adoc
@@ -391,7 +391,9 @@ Apache Solr provides three query parsers that work with 
dense vector fields, tha
 
 All parsers return scores for retrieved documents that are the approximate 
distance to the target vector (defined by the similarityFunction configured at 
indexing time) and both support "Pre-Filtering" the document graph to reduce 
the number of candidate vectors evaluated (without needing to compute their 
vector similarity distances).
 
-Common parameters for both query parsers are:
+While field queries and bounded range queries are not supported on 
`DenseVectorField`, existence queries such as `vector:*` (or the equivalent 
`vector:[* TO *]`) can be used to match documents that have a value for the 
vector field.
+
+Common parameters for all query parsers are:
 
 `f`::
 +

Reply via email to