@@ -1753,9 +1753,10 @@ async def get_online_features_async(
1753
1753
1754
1754
def retrieve_online_documents (
1755
1755
self ,
1756
- feature : str ,
1756
+ feature : Optional [ str ] ,
1757
1757
query : Union [str , List [float ]],
1758
1758
top_k : int ,
1759
+ features : Optional [List [str ]] = None ,
1759
1760
distance_metric : Optional [str ] = None ,
1760
1761
) -> OnlineResponse :
1761
1762
"""
@@ -1765,6 +1766,7 @@ def retrieve_online_documents(
1765
1766
feature: The list of document features that should be retrieved from the online document store. These features can be
1766
1767
specified either as a list of string document feature references or as a feature service. String feature
1767
1768
references must have format "feature_view:feature", e.g, "document_fv:document_embeddings".
1769
+ features: The list of features that should be retrieved from the online store.
1768
1770
query: The query to retrieve the closest document features for.
1769
1771
top_k: The number of closest document features to retrieve.
1770
1772
distance_metric: The distance metric to use for retrieval.
@@ -1773,18 +1775,44 @@ def retrieve_online_documents(
1773
1775
raise ValueError (
1774
1776
"Using embedding functionality is not supported for document retrieval. Please embed the query before calling retrieve_online_documents."
1775
1777
)
1778
+ feature_list : List [str ] = (
1779
+ features
1780
+ if features is not None
1781
+ else ([feature ] if feature is not None else [])
1782
+ )
1783
+
1776
1784
(
1777
1785
available_feature_views ,
1778
1786
_ ,
1779
1787
) = utils ._get_feature_views_to_use (
1780
1788
registry = self ._registry ,
1781
1789
project = self .project ,
1782
- features = [ feature ] ,
1790
+ features = feature_list ,
1783
1791
allow_cache = True ,
1784
1792
hide_dummy_entity = False ,
1785
1793
)
1794
+ if features :
1795
+ feature_view_set = set ()
1796
+ for feature in features :
1797
+ feature_view_name = feature .split (":" )[0 ]
1798
+ feature_view = self .get_feature_view (feature_view_name )
1799
+ feature_view_set .add (feature_view .name )
1800
+ if len (feature_view_set ) > 1 :
1801
+ raise ValueError (
1802
+ "Document retrieval only supports a single feature view."
1803
+ )
1804
+ requested_feature = None
1805
+ requested_features = [
1806
+ f .split (":" )[1 ] for f in features if isinstance (f , str ) and ":" in f
1807
+ ]
1808
+ else :
1809
+ requested_feature = (
1810
+ feature .split (":" )[1 ] if isinstance (feature , str ) else feature
1811
+ )
1812
+ requested_features = [requested_feature ] if requested_feature else []
1813
+
1786
1814
requested_feature_view_name = (
1787
- feature .split (":" )[0 ] if isinstance ( feature , str ) else feature
1815
+ feature .split (":" )[0 ] if feature else list ( feature_view_set )[ 0 ]
1788
1816
)
1789
1817
for feature_view in available_feature_views :
1790
1818
if feature_view .name == requested_feature_view_name :
@@ -1793,14 +1821,15 @@ def retrieve_online_documents(
1793
1821
raise ValueError (
1794
1822
f"Feature view { requested_feature_view } not found in the registry."
1795
1823
)
1796
- requested_feature = (
1797
- feature . split ( ":" )[ 1 ] if isinstance ( feature , str ) else feature
1798
- )
1824
+
1825
+ requested_feature_view = available_feature_views [ 0 ]
1826
+
1799
1827
provider = self ._get_provider ()
1800
1828
document_features = self ._retrieve_from_online_store (
1801
1829
provider ,
1802
1830
requested_feature_view ,
1803
1831
requested_feature ,
1832
+ requested_features ,
1804
1833
query ,
1805
1834
top_k ,
1806
1835
distance_metric ,
@@ -1822,6 +1851,7 @@ def retrieve_online_documents(
1822
1851
document_feature_vals = [feature [4 ] for feature in document_features ]
1823
1852
document_feature_distance_vals = [feature [5 ] for feature in document_features ]
1824
1853
online_features_response = GetOnlineFeaturesResponse (results = [])
1854
+ requested_feature = requested_feature or requested_features [0 ]
1825
1855
utils ._populate_result_rows_from_columnar (
1826
1856
online_features_response = online_features_response ,
1827
1857
data = {
@@ -1836,7 +1866,8 @@ def _retrieve_from_online_store(
1836
1866
self ,
1837
1867
provider : Provider ,
1838
1868
table : FeatureView ,
1839
- requested_feature : str ,
1869
+ requested_feature : Optional [str ],
1870
+ requested_features : Optional [List [str ]],
1840
1871
query : List [float ],
1841
1872
top_k : int ,
1842
1873
distance_metric : Optional [str ],
@@ -1852,6 +1883,7 @@ def _retrieve_from_online_store(
1852
1883
config = self .config ,
1853
1884
table = table ,
1854
1885
requested_feature = requested_feature ,
1886
+ requested_features = requested_features ,
1855
1887
query = query ,
1856
1888
top_k = top_k ,
1857
1889
distance_metric = distance_metric ,
@@ -1952,19 +1984,13 @@ def serve_ui(
1952
1984
)
1953
1985
1954
1986
def serve_registry (
1955
- self ,
1956
- port : int ,
1957
- tls_key_path : str = "" ,
1958
- tls_cert_path : str = "" ,
1987
+ self , port : int , tls_key_path : str = "" , tls_cert_path : str = ""
1959
1988
) -> None :
1960
1989
"""Start registry server locally on a given port."""
1961
1990
from feast import registry_server
1962
1991
1963
1992
registry_server .start_server (
1964
- self ,
1965
- port = port ,
1966
- tls_key_path = tls_key_path ,
1967
- tls_cert_path = tls_cert_path ,
1993
+ self , port = port , tls_key_path = tls_key_path , tls_cert_path = tls_cert_path
1968
1994
)
1969
1995
1970
1996
def serve_offline (
0 commit comments