From fc252149e38daab51e97bd791341b2ad50ad5a31 Mon Sep 17 00:00:00 2001 From: smilerz Date: Wed, 21 Apr 2021 19:01:20 -0500 Subject: [PATCH] add trigrams to search rank --- cookbook/helper/recipe_search.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/cookbook/helper/recipe_search.py b/cookbook/helper/recipe_search.py index 09c1a0c9c..af9416e40 100644 --- a/cookbook/helper/recipe_search.py +++ b/cookbook/helper/recipe_search.py @@ -6,6 +6,7 @@ from django.contrib.postgres.aggregates import StringAgg from django.contrib.postgres.search import ( SearchQuery, SearchRank, SearchVector, TrigramSimilarity, ) +from django.db.models import Q from django.utils import translation @@ -45,19 +46,26 @@ def search_recipes(queryset, params): language = DICTIONARY.get(translation.get_language(), 'simple') search_query = SearchQuery( search_string, + search_type="websearch", config=language, - search_type="websearch" ) search_vectors = ( SearchVector('search_vector') + SearchVector(StringAgg('steps__ingredients__food__name', delimiter=' '), weight='B', config=language) + SearchVector(StringAgg('keywords__name', delimiter=' '), weight='B', config=language)) + trigram = ( + TrigramSimilarity('name', search_string) + + TrigramSimilarity('description', search_string) + ) search_rank = SearchRank(search_vectors, search_query) queryset = ( queryset.annotate( search=search_vectors, - rank=search_rank,) - .filter(search=search_query) + rank=search_rank + trigram, + ) + .filter( + search_vector=search_query + ) .order_by('-rank')) else: queryset = queryset.filter(name__icontains=search_string)