diff --git a/haystack/components/rankers/meta_field.py b/haystack/components/rankers/meta_field.py index b5ce892394..c3b3475560 100644 --- a/haystack/components/rankers/meta_field.py +++ b/haystack/components/rankers/meta_field.py @@ -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 is currently set to '{meta_field}', but none of the provided " "Documents with IDs {document_ids} have this meta key.\n" "Set to the name of a field that is present within the provided Documents.\n" - "Returning the of the original Documents since there are no values to rank.", + "Applying the configured 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: diff --git a/releasenotes/notes/fix-metafield-ranker-missing-meta-99197f6d6faaf8e3.yaml b/releasenotes/notes/fix-metafield-ranker-missing-meta-99197f6d6faaf8e3.yaml new file mode 100644 index 0000000000..e1e1f7b464 --- /dev/null +++ b/releasenotes/notes/fix-metafield-ranker-missing-meta-99197f6d6faaf8e3.yaml @@ -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. diff --git a/test/components/rankers/test_metafield.py b/test/components/rankers/test_metafield.py index a998ab4cb5..6e25f871c8 100644 --- a/test/components/rankers/test_metafield.py +++ b/test/components/rankers/test_metafield.py @@ -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