Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions docs/changelog/128323.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
pr: 128323
summary: "Fix: Allow non-score sorts in pinned retriever sub-retrievers"
area: Relevance
type: bug
issues: []
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,7 @@
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;
Expand Down Expand Up @@ -106,16 +104,9 @@ private void validateSort(SearchSourceBuilder source) {
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)) {
throw new IllegalArgumentException(
"[" + NAME + "] retriever only supports sorting by score, invalid sort criterion: " + sort.toString()
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,18 @@ public void testValidateSort() {
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).getField(), equalTo("_score"));
assertThat(multipleSortsSource.sorts().get(0).getOrder(), equalTo(SortOrder.DESC));
assertThat(multipleSortsSource.sorts().get(1).getField(), equalTo("field1"));
assertThat(multipleSortsSource.sorts().get(1).getOrder(), 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(
Expand Down
Loading