From 36ed550c8cd0fd69ecfd6507d2422e8796bc1ba4 Mon Sep 17 00:00:00 2001 From: sliptype Date: Thu, 13 Jun 2024 15:06:03 -0500 Subject: [PATCH 1/2] Add profile genre filter param (unsorted) --- .../src/queries/search_es.py | 25 ++++++++++++++++++- .../pages/search-page-v2/SearchResults.tsx | 2 +- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/packages/discovery-provider/src/queries/search_es.py b/packages/discovery-provider/src/queries/search_es.py index 9b78a764d37..07d8d18a5e1 100644 --- a/packages/discovery-provider/src/queries/search_es.py +++ b/packages/discovery-provider/src/queries/search_es.py @@ -89,6 +89,7 @@ def search_es_full(args: dict): current_user_id=current_user_id, must_saved=False, only_verified=only_verified, + genres=genres, ), ] ) @@ -469,10 +470,17 @@ def track_dsl( dsl["must_not"].append({"term": {"purchaseable": {"value": True}}}) personalize_dsl(dsl, current_user_id, must_saved) + return default_function_score(dsl, "repost_count") -def user_dsl(search_str, current_user_id, only_verified, must_saved=False): +def user_dsl( + search_str, + current_user_id, + only_verified, + must_saved=False, + genres=[], +): # must_search_str = search_str + " " + search_str.replace(" ", "") dsl = { "must": [ @@ -574,6 +582,21 @@ def user_dsl(search_str, current_user_id, only_verified, must_saved=False): ], } + if genres: + capitalized_genres = list( + filter( + None, + [get_capitalized_genre(genre) for genre in genres if genre is not None], + ) + ) + if capitalized_genres: + # At least one track genre must match + dsl["must"].append({"terms": {"tracks.genre": capitalized_genres}}) + # Boost results with multiple tracks matching genre + dsl["should"].append( + {"terms": {"tracks.genre": capitalized_genres, "boost": 10}} + ) + if current_user_id and must_saved: dsl["must"].append(be_followed(current_user_id)) diff --git a/packages/web/src/pages/search-page-v2/SearchResults.tsx b/packages/web/src/pages/search-page-v2/SearchResults.tsx index e12d7db6902..9bd98671b8d 100644 --- a/packages/web/src/pages/search-page-v2/SearchResults.tsx +++ b/packages/web/src/pages/search-page-v2/SearchResults.tsx @@ -99,7 +99,7 @@ export const SearchResults = ({ query }: SearchResultsProps) => { const sort = urlSearchParams.get('sort') const genre = urlSearchParams.get('genre') const mood = urlSearchParams.get('mood') - const isVerified = urlSearchParams.get('is_verified') + const isVerified = urlSearchParams.get('isVerified') const isLoading = results.status === Status.LOADING const dispatch = useDispatch() From b608be3cf8c7033fe2c5ec75db0434ed68173ff4 Mon Sep 17 00:00:00 2001 From: sliptype Date: Thu, 13 Jun 2024 15:36:43 -0500 Subject: [PATCH 2/2] correctly boost/sort profiles based on genre --- .../src/queries/search_es.py | 55 +++++++++++++------ 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/packages/discovery-provider/src/queries/search_es.py b/packages/discovery-provider/src/queries/search_es.py index 07d8d18a5e1..c363c0ac930 100644 --- a/packages/discovery-provider/src/queries/search_es.py +++ b/packages/discovery-provider/src/queries/search_es.py @@ -582,21 +582,6 @@ def user_dsl( ], } - if genres: - capitalized_genres = list( - filter( - None, - [get_capitalized_genre(genre) for genre in genres if genre is not None], - ) - ) - if capitalized_genres: - # At least one track genre must match - dsl["must"].append({"terms": {"tracks.genre": capitalized_genres}}) - # Boost results with multiple tracks matching genre - dsl["should"].append( - {"terms": {"tracks.genre": capitalized_genres, "boost": 10}} - ) - if current_user_id and must_saved: dsl["must"].append(be_followed(current_user_id)) @@ -606,10 +591,9 @@ def user_dsl( if current_user_id: dsl["should"].append(be_followed(current_user_id)) - return { + query = { "query": { "function_score": { - "query": {"bool": dsl}, "functions": [ { "filter": {"term": {"is_verified": True}}, @@ -633,6 +617,43 @@ def user_dsl( } } + if genres: + capitalized_genres = list( + filter( + None, + [get_capitalized_genre(genre) for genre in genres if genre is not None], + ) + ) + if capitalized_genres: + # At least one track genre must match + dsl["must"].append({"terms": {"tracks.genre": capitalized_genres}}) + # Boost profiles with multiple tracks matching genre + query["query"]["function_score"]["functions"].append( + { + "script_score": { + "script": { + "source": """ + double matchedTracks = 0; + for (track in params['_source'].tracks) { + if (params.genres.contains(track.genre)) { + matchedTracks++; + } + } + return Math.log(1 + matchedTracks) * params.boost; + """, + "params": { + "genres": capitalized_genres, + "boost": 2, + }, + } + }, + } + ) + + # Set the dsl on the query object + query["query"]["function_score"]["query"] = {"bool": dsl} + return query + def base_playlist_dsl(search_str, is_album): return {