-
Notifications
You must be signed in to change notification settings - Fork 125
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[RFC] Multiple inner hits for nested field #2249
[RFC] Multiple inner hits for nested field #2249
Comments
@heemin32 do we have details around this what will be the parameter and what will be the shape of that parameter? |
@heemin32 So for quantization (assuming no re-scoring) would this mean that some of the results have approximated scores and some have full precision scores? Or would they all have full precision scores? If the latter is the case, then would we need to update the overall docs score? |
Something like |
They all will have full precision scores. I was going to accept the score difference to avoid latency degradation but we can discuss about it. If we don't want the score to be different between those two, we should do this retrieval for both nested field query and inner hit query. |
Update
We are going to introduce a new parameter,
expand_nested_docs
in knn query. The default value will be false.This parameter retrieves all nested documents of the top-k parent documents. Since the default score mode for nested field queries is
avg
, enabling this parameter will alter the parent document scores and their order in the search results. To maintain the current scoring, users can set thescore_mode
tomax
.The primary purpose of this change is to ensure consistency between the main query and the
inner_hit
query, eliminating the risk of score discrepancies between the two. Additionally, for use cases where multiinner_hits
are not required, queries withexpand_nested_docs
set tofalse
will have reduced latency. This approach also offers the added benefit of allowing users to experiment with alternativescore_mode
options, such asavg
orsum
, beyond themax
. However, it’s important to note that using avg or sum does not guarantee the returned documents are true top-k by those modes; the top-k is initially determined by max and then reordered using avg or sum among those documents.Overview
Following the launch of multi-vector support in k-NN nested fields, search results with inner hits currently return only the single highest-scoring nested document per parent document. However, many users prefer to see the scores of all nested documents within inner hits, allowing them to display all relevant nested documents rather than just the top-scoring one.
Related GitHub Issue
Work Items
Current state
Let’s try to understand the issue with example. First we are ingesting a document with two nested documents each of which has vector [1, 1, 1], and vector [2, 2, 2].
Then, we execute the search with inner_hits parameter.
The search result returns only single nested document with vector [1, 1, 1]
Desired state
We want to have all nested documents inside inner_hits block for each returned parent documents.
Class diagram
For Faiss
For faiss, we need to migrate the entire query to NativeEngineKnnVectorQuery from KNNQuery. Currently, we use NativeEngineKnnVectorQuery only when the rescoring context exist.
Inside createWeight method of NativeEngineKnnVectorQuery, if it is nested field, we do another exact search with filtering on topK parentIds to retrieve all child documents with its score.
For Lucene
For lucene, we will create our own wrapper query around lucene knn query as @navneet1v suggested in this GitHub issue. #2115
The rest of the code logic will be similar to NativeEngineKnnVectorQuery where we do another exact search on topK parentIds to retrieve all child documents with its score.
Separating nested field query with innerHit query
Currently, KNNQueryBuilder.doToQuery(QueryShardContext) is called twice when innerHit is requested: one for nested field query and another for inner hit query. We want to add new field in QueryShardContext to distinguish if this is for nested field query or inner hit query so that we can retrieve all child documents only for inner hit query. The reason of not retrieving all child documents for nested field query is to avoid a degradation on latency. This is a two way door where we can support retrieving all child documents for nested field query if we want to support different scoring mode other than max. #1743
The text was updated successfully, but these errors were encountered: