From 315441c92fa3195b6dd18e5975bdffbc9ac28be1 Mon Sep 17 00:00:00 2001 From: Houston Putman Date: Fri, 7 Nov 2025 12:40:55 -0800 Subject: [PATCH 1/3] SOLR-17985: Speed up no-rows distributed queries --- .../solr/handler/component/QueryComponent.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java b/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java index cf174f21217..97fb452ed4f 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java +++ b/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java @@ -832,20 +832,24 @@ protected void createMainQuery(ResponseBuilder rb) { // perhaps we shouldn't attempt to parse the query at this level? // Alternate Idea: instead of specifying all these things at the upper level, // we could just specify that this is a shard request. + int shardRows; if (rb.shards_rows > -1) { // if the client set shards.rows set this explicity - sreq.params.set(CommonParams.ROWS, rb.shards_rows); + shardRows = rb.shards_rows; } else { - // what if rows<0 as it is allowed for grouped request?? - sreq.params.set( - CommonParams.ROWS, rb.getSortSpec().getOffset() + rb.getSortSpec().getCount()); + shardRows = rb.getSortSpec().getCount(); + if (shardRows > 0) { + // If rows = -1 (grouped requests) or rows = 0, then there is no need to add the offset. + shardRows += rb.getSortSpec().getOffset(); + } } + sreq.params.set(CommonParams.ROWS, shardRows); sreq.params.set(ResponseBuilder.FIELD_SORT_VALUES, "true"); boolean shardQueryIncludeScore = (rb.getFieldFlags() & SolrIndexSearcher.GET_SCORES) != 0 - || rb.getSortSpec().includesScore(); + || (shardRows != 0 && rb.getSortSpec().includesScore()); StringBuilder additionalFL = new StringBuilder(); boolean additionalAdded = false; if (rb.onePassDistributedQuery) { From 3d55d843f0701a8343a28cee138598a09b8f49c3 Mon Sep 17 00:00:00 2001 From: Houston Putman Date: Fri, 7 Nov 2025 14:06:12 -0800 Subject: [PATCH 2/3] Tidy, changelog --- .../unreleased/SOLR-17985-fix-slow-no-rows-queries.yml | 10 ++++++++++ .../apache/solr/handler/component/QueryComponent.java | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 changelog/unreleased/SOLR-17985-fix-slow-no-rows-queries.yml diff --git a/changelog/unreleased/SOLR-17985-fix-slow-no-rows-queries.yml b/changelog/unreleased/SOLR-17985-fix-slow-no-rows-queries.yml new file mode 100644 index 00000000000..f7d5f2cee52 --- /dev/null +++ b/changelog/unreleased/SOLR-17985-fix-slow-no-rows-queries.yml @@ -0,0 +1,10 @@ +# See https://github.com/apache/solr/blob/main/dev-docs/changelog.adoc +title: Make distributed no-rows queries fast again +type: fixed # added, changed, fixed, deprecated, removed, dependency_update, security, other +authors: + - name: Houston Putman + nick: HoustonPutman + url: https://home.apache.org/phonebook.html?uid=houston +links: + - name: SOLR-17985 + url: https://issues.apache.org/jira/browse/SOLR-17985 diff --git a/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java b/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java index 97fb452ed4f..ac30f46e6eb 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java +++ b/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java @@ -837,7 +837,7 @@ protected void createMainQuery(ResponseBuilder rb) { // if the client set shards.rows set this explicity shardRows = rb.shards_rows; } else { - shardRows = rb.getSortSpec().getCount(); + shardRows = rb.getSortSpec().getCount(); if (shardRows > 0) { // If rows = -1 (grouped requests) or rows = 0, then there is no need to add the offset. shardRows += rb.getSortSpec().getOffset(); From c2d2325398dc8d8526197a39025be28cbde94663 Mon Sep 17 00:00:00 2001 From: Houston Putman Date: Mon, 10 Nov 2025 14:05:40 -0800 Subject: [PATCH 3/3] Add test, move comment --- .../org/apache/solr/handler/component/QueryComponent.java | 2 +- .../src/test/org/apache/solr/TestDistributedSearch.java | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java b/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java index ac30f46e6eb..30875caa70f 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java +++ b/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java @@ -838,8 +838,8 @@ protected void createMainQuery(ResponseBuilder rb) { shardRows = rb.shards_rows; } else { shardRows = rb.getSortSpec().getCount(); + // If rows = -1 (grouped requests) or rows = 0, then there is no need to add the offset. if (shardRows > 0) { - // If rows = -1 (grouped requests) or rows = 0, then there is no need to add the offset. shardRows += rb.getSortSpec().getOffset(); } } diff --git a/solr/core/src/test/org/apache/solr/TestDistributedSearch.java b/solr/core/src/test/org/apache/solr/TestDistributedSearch.java index 72d0493be55..4993a96c30e 100644 --- a/solr/core/src/test/org/apache/solr/TestDistributedSearch.java +++ b/solr/core/src/test/org/apache/solr/TestDistributedSearch.java @@ -1550,6 +1550,7 @@ public void test() throws Exception { // Check Info is added to for each shard ModifiableSolrParams q = new ModifiableSolrParams(); q.set("q", "*:*"); + q.set("rows", "0"); q.set(ShardParams.SHARDS_INFO, true); setDistributedParams(q); rsp = queryRandomShard(q); @@ -1560,6 +1561,13 @@ public void test() throws Exception { assertNotNull("missing shard info", sinfo); assertEquals( "should have an entry for each shard [" + sinfo + "] " + shards, cnt, sinfo.size()); + // We are setting rows=0, so scores should not be collected + for (int i = 0; i < cnt; i++) { + String shard = sinfo.getName(i); + assertNull( + "should not have any score information (maxScore) in the shard info: " + shard, + ((Map) sinfo.get(shard)).get("maxScore")); + } // test shards.tolerant=true