Fix: Allow non-score sorts in pinned retriever sub-retrievers (#128323)

* Fix scoring and sort handling in pinned retriever

* Remove books.es from version control and add to .gitignore

* Remove books.es from version control and add to .gitignore

* Remove books.es entries from .gitignore

* fixed the mess

* Update x-pack/plugin/search-business-rules/src/test/java/org/elasticsearch/xpack/searchbusinessrules/retriever/PinnedRetrieverBuilderTests.java

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update x-pack/plugin/search-business-rules/src/main/java/org/elasticsearch/xpack/searchbusinessrules/retriever/PinnedRetrieverBuilder.java

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Mridula 2025-05-30 08:01:01 +01:00 committed by GitHub
parent e453b53ab6
commit cc461afa0a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 25 additions and 13 deletions

View file

@ -0,0 +1,5 @@
pr: 128323
summary: "Fix: Allow non-score secondary sorts in pinned retriever sub-retrievers"
area: Relevance
type: bug
issues: []

View file

@ -18,9 +18,7 @@ import org.elasticsearch.search.retriever.CompoundRetrieverBuilder;
import org.elasticsearch.search.retriever.RetrieverBuilder;
import org.elasticsearch.search.retriever.RetrieverBuilderWrapper;
import org.elasticsearch.search.retriever.RetrieverParserContext;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.ScoreSortBuilder;
import org.elasticsearch.search.sort.ShardDocSortField;
import org.elasticsearch.search.sort.SortBuilder;
import org.elasticsearch.xcontent.ConstructingObjectParser;
import org.elasticsearch.xcontent.ParseField;
@ -106,16 +104,9 @@ public final class PinnedRetrieverBuilder extends CompoundRetrieverBuilder<Pinne
if (sorts == null || sorts.isEmpty()) {
return;
}
for (SortBuilder<?> sort : sorts) {
if (sort instanceof ScoreSortBuilder) {
continue;
}
if (sort instanceof FieldSortBuilder) {
FieldSortBuilder fieldSort = (FieldSortBuilder) sort;
if (ShardDocSortField.NAME.equals(fieldSort.getFieldName())) {
continue;
}
}
SortBuilder<?> sort = sorts.get(0);
if (sort instanceof ScoreSortBuilder == false) {
throw new IllegalArgumentException(
"[" + NAME + "] retriever only supports sorting by score, invalid sort criterion: " + sort.toString()
);

View file

@ -16,6 +16,9 @@ import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.retriever.RetrieverBuilder;
import org.elasticsearch.search.retriever.RetrieverParserContext;
import org.elasticsearch.search.retriever.TestRetrieverBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.ScoreSortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.test.AbstractXContentTestCase;
import org.elasticsearch.usage.SearchUsage;
import org.elasticsearch.usage.SearchUsageHolder;
@ -209,7 +212,20 @@ public class PinnedRetrieverBuilderTests extends AbstractXContentTestCase<Pinned
multipleSortsSource.query(dummyQuery);
multipleSortsSource.sort("_score");
multipleSortsSource.sort("field1");
e = expectThrows(IllegalArgumentException.class, () -> builder.finalizeSourceBuilder(multipleSortsSource));
builder.finalizeSourceBuilder(multipleSortsSource);
assertThat(multipleSortsSource.sorts().size(), equalTo(2));
assertThat(multipleSortsSource.sorts().get(0), instanceOf(ScoreSortBuilder.class));
assertThat(((ScoreSortBuilder) multipleSortsSource.sorts().get(0)).order(), equalTo(SortOrder.DESC));
assertThat(multipleSortsSource.sorts().get(1), instanceOf(FieldSortBuilder.class));
assertThat(((FieldSortBuilder) multipleSortsSource.sorts().get(1)).getFieldName(), equalTo("field1"));
assertThat(((FieldSortBuilder) multipleSortsSource.sorts().get(1)).order(), equalTo(SortOrder.ASC));
SearchSourceBuilder fieldFirstSource = new SearchSourceBuilder();
fieldFirstSource.query(dummyQuery);
fieldFirstSource.sort("field1");
fieldFirstSource.sort("_score");
e = expectThrows(IllegalArgumentException.class, () -> builder.finalizeSourceBuilder(fieldFirstSource));
assertThat(
e.getMessage(),
equalTo(