weaviate / weaviate/java-client

v6: rerank score is never unmarshalled from the search reply

Open
#604 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Java
Stars
34
Forks
30
PR merge metrics
No merged PRs in 30d

Description

Summary

The server returns a rerank score per object (and per group for a grouped search), but the client never unmarshals it. A reranked search therefore arrives correctly ordered with the number that produced the order missing, and there is no way to get it through the public API.

Per object

MetadataResult carries both the value and an explicit presence flag:

double rerank_score = 21;
bool   rerank_score_present = 22;

but QueryMetadata exposes only four fields:

public final class QueryMetadata extends Record {
    public Float  distance();
    public Float  certainty();
    public Float  score();
    public String explainScore();
}

Per group

Same thing on the grouped path. GroupByResult.rerank is a RerankReply { double score = 1; }, while QueryResponseGroup exposes only:

public String name();
public Float  minDistance();
public Float  maxDistance();
public long   numberOfObjects();
public List<QueryObjectGrouped<T>> objects();

The field is never read

Extracting io/weaviate/client6/v1/api/** and io/weaviate/client6/v1/internal/orm/** from client6-6.3.1-all.jar and grepping for rerankScore, getRerankScore and RerankReply returns zero matches. Disassembling the QueryResponse unmarshaller shows it reading getCreationTimeUnix, getLastUpdateTimeUnix, getDistance, getCertainty, getScore and getExplainScore — and nothing else.

The server does populate it

Wrapping the Rpc returned by QueryRequest.rpc(...) and reading MetadataResult off the reply before delegating to the real unmarshal yields real values, correlated by uuid — querying "fish" over a set of animal descriptions with reranker-cohere:

0.781147420  The fish is an aquatic animal that lives ...
0.051658671  The dog is a very popular domestic anima ...
0.050354082  The lion is a wild and majestic animal,  ...

The row order matches the score descending, which is exactly the ordering the server applied — so the data is present on the reply and simply discarded.

Impact

Without this, a client cannot show or threshold on the rerank score, or explain the resulting order. The only workaround is to reach into GrpcTransport/QueryRequest internals and re-read the reply, which is not something a consumer should have to do.

Suggested fix

Add a rerankScore component to QueryMetadata (honouring rerank_score_present, since 0.0 is a legitimate score) and read it in the QueryResponse unmarshaller. The same for QueryResponseGroup from GroupByResult.rerank.

Version

  • java-client 6.3.1 (also present in 6.3.0)
  • Weaviate 1.39.0

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Trace the QueryResponse unmarshaller in the client6 API and internal ORM packages, starting with the existing reads for distance, certainty, score, and explainScore. Inspect QueryMetadata and QueryResponseGroup alongside MetadataResult and GroupByResult.rerank. Done means rerank scores, including explicit presence handling, are available through both public object and grouped-result APIs.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
api, backend-api-design
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
74/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.