ESQL/Search: Fix scoring when RANK and WHERE are both specified #109851
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
DRAFT: WIP needs more tests
Fixes the following issues:
SEARCH test [ | WHERE id > 2 AND id <= 4 ]
returned scores > 0 - in this case we are only filtering the results, which has no effect on scoring, hence the return scores should all be0
.RANK
andWHERE
returned scores equal to0
- for exampleSEARCH test [ | WHERE id > 2 | RANK MATCH(content, "quick brown dog")]
This happened because of the way we were forming the boolean query.
PushRankToSource
now translates theRANK
expression as aSHOULD
clause, instead ofFILTER
.Both
PushRankToSource
andPushFiltersToSource
usedQueries.combine
which receives the type of clause to use and the a list of queries. If the list of queries contains a single non-null query, it simply returns that query - it will not actually construct a boolean query. FurthermoreQueriesCombine
will check if the first query from the list is a boolean query and it will attempt to reuse it.To work around this behaviour we made sure that the first query that is being sent to
QueriesCombine
is always a boolean query.Furthermore, I had to put the
minimumShouldMatch: 1
- so that whenRANK
is used, we return documents that match theRANK
expression.