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

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

commit d509a02b549d1f8a0ddefcf9c1414057683431e7
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     |  2 ++
 4 files changed, 49 insertions(+), 9 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 797b6bfc9a7..f010c741b07 100644
--- a/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java
+++ b/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java
@@ -37,6 +37,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.PatienceKnnVectorQuery;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.SeededKnnVectorQuery;
@@ -572,6 +573,11 @@ public class DenseVectorField extends FloatPointField {
     return baseQuery;
   }
 
+  @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.
    */
@@ -582,7 +588,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,
@@ -591,6 +600,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 a11e184e2e1..442a0cd4eef 100644
--- a/solr/core/src/test/org/apache/solr/schema/DenseVectorFieldTest.java
+++ b/solr/core/src/test/org/apache/solr/schema/DenseVectorFieldTest.java
@@ -556,18 +556,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 1eaf66c3825..aaaa5c18ad1 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
@@ -355,6 +355,8 @@ Apache Solr provides three query parsers that work with the 
`DenseVectorField` f
 
 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).
 
+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