diff --git a/backend/app/models/search.py b/backend/app/models/search.py index 3c9aac6de..012e0657d 100644 --- a/backend/app/models/search.py +++ b/backend/app/models/search.py @@ -44,4 +44,5 @@ class ElasticsearchEntry(BaseModel): bytes: Optional[int] # metadata fields metadata: Optional[List[dict]] = [] + metadata_stringify: Optional[str] status: Optional[str] diff --git a/backend/app/search/config.py b/backend/app/search/config.py index 99100c125..2a97387f1 100644 --- a/backend/app/search/config.py +++ b/backend/app/search/config.py @@ -19,7 +19,10 @@ class IndexSettings: # metadata fields "metadata": { "type": "object", + "dynamic": True, }, + # metadata fields cast to plain string to enable search + "metadata_stringify": {"type": "text"}, } } diff --git a/backend/app/search/index.py b/backend/app/search/index.py index 60c512e0c..b9482d76a 100644 --- a/backend/app/search/index.py +++ b/backend/app/search/index.py @@ -1,3 +1,4 @@ +import json from typing import List, Optional, Union from app.config import settings @@ -51,6 +52,7 @@ async def index_dataset( downloads=dataset.downloads, user_ids=authorized_user_ids, metadata=metadata, + metadata_stringify=json.dumps(metadata), status=dataset_status, ).dict() @@ -103,6 +105,7 @@ async def index_file( folder_id=str(file.folder_id), bytes=file.bytes, metadata=metadata, + metadata_stringify=json.dumps(metadata), status=file.status, ).dict() if update: @@ -198,6 +201,7 @@ async def index_thumbnail( folder_id=str(file.folder_id), bytes=thumbnail.bytes, metadata=metadata, + metadata_stringify=json.dumps(metadata), downloads=thumbnail.downloads, ).dict() if update: diff --git a/frontend/src/components/search/EmbeddedPublicSearch.tsx b/frontend/src/components/search/EmbeddedPublicSearch.tsx index 85e09eefd..f47fe8f08 100644 --- a/frontend/src/components/search/EmbeddedPublicSearch.tsx +++ b/frontend/src/components/search/EmbeddedPublicSearch.tsx @@ -46,7 +46,13 @@ export function EmbeddedPublicSearch() { showFilter={true} showClear renderNoSuggestion="No suggestions found." - dataField={["name", "description"]} + dataField={[ + "name", + "description", + "metadata_stringify", + "creator.keyword", + ]} + fieldWeights={[3, 2, 2, 1]} // placeholder="Search for Dataset" innerClass={{ title: "search-title", diff --git a/frontend/src/components/search/EmbeddedSearch.tsx b/frontend/src/components/search/EmbeddedSearch.tsx index 3119fcd39..2f29decf1 100644 --- a/frontend/src/components/search/EmbeddedSearch.tsx +++ b/frontend/src/components/search/EmbeddedSearch.tsx @@ -46,7 +46,13 @@ export function EmbeddedSearch() { showFilter={true} showClear renderNoSuggestion="No suggestions found." - dataField={["name", "description", "creator.keyword"]} + dataField={[ + "name", + "description", + "metadata_stringify", + "creator.keyword", + ]} + fieldWeights={[3, 2, 2, 1]} // placeholder="Search for Dataset" innerClass={{ title: "search-title", diff --git a/frontend/src/components/search/PublicSearch.tsx b/frontend/src/components/search/PublicSearch.tsx index deb16fa3b..44011eddc 100644 --- a/frontend/src/components/search/PublicSearch.tsx +++ b/frontend/src/components/search/PublicSearch.tsx @@ -95,8 +95,13 @@ export function PublicSearch() { showFilter={true} showClear={true} renderNoSuggestion="No suggestions found." - dataField={["name", "description"]} - fieldWeights={[3, 2, 1]} + dataField={[ + "name", + "description", + "metadata_stringify", + "creator.keyword", + ]} + fieldWeights={[3, 2, 2, 1]} innerClass={{ title: "search-title", input: "search-input", diff --git a/frontend/src/components/search/Search.tsx b/frontend/src/components/search/Search.tsx index e8773c3ac..27de9183d 100644 --- a/frontend/src/components/search/Search.tsx +++ b/frontend/src/components/search/Search.tsx @@ -122,8 +122,13 @@ export function Search() { showFilter={true} showClear={true} renderNoSuggestion="No suggestions found." - dataField={["name", "description", "creator.keyword"]} - fieldWeights={[3, 2, 1]} + dataField={[ + "name", + "description", + "metadata_stringify", + "creator.keyword", + ]} + fieldWeights={[3, 2, 2, 1]} innerClass={{ title: "search-title", input: "search-input",