Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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: 3 additions & 2 deletions haystack/components/rankers/meta_field.py
Original file line number Diff line number Diff line change
Expand Up @@ -258,16 +258,17 @@ def run(
docs_with_meta_field = [doc for doc in deduplicated_documents if doc.meta.get(self.meta_field) is not None]
docs_missing_meta_field = [doc for doc in deduplicated_documents if doc.meta.get(self.meta_field) is None]

# If all docs are missing self.meta_field return original documents
if len(docs_with_meta_field) == 0:
logger.warning(
"The parameter <meta_field> is currently set to '{meta_field}', but none of the provided "
"Documents with IDs {document_ids} have this meta key.\n"
"Set <meta_field> to the name of a field that is present within the provided Documents.\n"
"Returning the <top_k> of the original Documents since there are no values to rank.",
"Applying the configured <missing_meta> policy instead of ranking.",
meta_field=self.meta_field,
document_ids=",".join([doc.id for doc in deduplicated_documents]),
)
if missing_meta == "drop":
return {"documents": []}
return {"documents": deduplicated_documents[:top_k]}

if len(docs_missing_meta_field) > 0:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
fixes:
- |
Fix ``MetaFieldRanker`` to return no documents when ``missing_meta="drop"``
and all documents lack the ranking field or have a ``None`` value.
19 changes: 19 additions & 0 deletions test/components/rankers/test_metafield.py
Original file line number Diff line number Diff line change
Expand Up @@ -338,3 +338,22 @@ def test_none_meta_value_is_handled_as_missing_meta(self, missing_meta, expected
]
output = ranker.run(documents=docs_before)
assert [doc.id for doc in output["documents"]] == expected_ids

@pytest.mark.parametrize(
("meta", "init_missing_meta", "run_missing_meta", "expected_ids"),
[
({}, "drop", None, []),
({}, "top", None, ["a", "b"]),
({}, "bottom", None, ["a", "b"]),
({}, "bottom", "drop", []),
({}, "drop", "top", ["a", "b"]),
({"rating": None}, "drop", None, []),
],
)
def test_missing_meta_when_all_values_are_missing(self, meta, init_missing_meta, run_missing_meta, expected_ids):
ranker = MetaFieldRanker(meta_field="rating", missing_meta=init_missing_meta)
docs = [Document(id="a", content="a", meta=meta), Document(id="b", content="b", meta=meta)]

output = ranker.run(documents=docs, missing_meta=run_missing_meta)

assert [doc.id for doc in output["documents"]] == expected_ids
Loading