diff --git a/elasticsearch_dsl/search_base.py b/elasticsearch_dsl/search_base.py index 50117e1b..096c2855 100644 --- a/elasticsearch_dsl/search_base.py +++ b/elasticsearch_dsl/search_base.py @@ -504,6 +504,7 @@ def knn( boost=None, filter=None, similarity=None, + inner_hits=None, ): """ Add a k-nearest neighbor (kNN) search. @@ -516,6 +517,7 @@ def knn( :arg boost: A floating-point boost factor for kNN scores :arg filter: query to filter the documents that can match :arg similarity: the minimum similarity required for a document to be considered a match, as a float value + :arg inner_hits: retrieve hits from nested field Example:: @@ -550,6 +552,8 @@ def knn( s._knn[-1]["filter"] = filter if similarity is not None: s._knn[-1]["similarity"] = similarity + if inner_hits is not None: + s._knn[-1]["inner_hits"] = inner_hits return s def rank(self, rrf=None): diff --git a/tests/_async/test_search.py b/tests/_async/test_search.py index 1f7ad1de..5033d851 100644 --- a/tests/_async/test_search.py +++ b/tests/_async/test_search.py @@ -266,6 +266,7 @@ def test_knn(): query_vector_builder={ "text_embedding": {"model_id": "foo", "model_text": "search text"} }, + inner_hits={"size": 1}, ) assert { "knn": [ @@ -283,6 +284,7 @@ def test_knn(): "text_embedding": {"model_id": "foo", "model_text": "search text"} }, "boost": 0.8, + "inner_hits": {"size": 1}, }, ] } == s.to_dict() diff --git a/tests/_sync/test_search.py b/tests/_sync/test_search.py index 306b09f5..52523137 100644 --- a/tests/_sync/test_search.py +++ b/tests/_sync/test_search.py @@ -266,6 +266,7 @@ def test_knn(): query_vector_builder={ "text_embedding": {"model_id": "foo", "model_text": "search text"} }, + inner_hits={"size": 1}, ) assert { "knn": [ @@ -283,6 +284,7 @@ def test_knn(): "text_embedding": {"model_id": "foo", "model_text": "search text"} }, "boost": 0.8, + "inner_hits": {"size": 1}, }, ] } == s.to_dict()