add trigrams to search rank

This commit is contained in:
smilerz
2021-04-21 19:01:20 -05:00
parent 6a5dea080e
commit e039590483

View File

@@ -6,6 +6,7 @@ from django.contrib.postgres.aggregates import StringAgg
from django.contrib.postgres.search import ( from django.contrib.postgres.search import (
SearchQuery, SearchRank, SearchVector, TrigramSimilarity, SearchQuery, SearchRank, SearchVector, TrigramSimilarity,
) )
from django.db.models import Q
from django.utils import translation from django.utils import translation
@@ -44,19 +45,26 @@ def search_recipes(queryset, params):
language = DICTIONARY.get(translation.get_language(), 'simple') language = DICTIONARY.get(translation.get_language(), 'simple')
search_query = SearchQuery( search_query = SearchQuery(
search_string, search_string,
search_type="websearch",
config=language, config=language,
search_type="websearch"
) )
search_vectors = ( search_vectors = (
SearchVector('search_vector') SearchVector('search_vector')
+ SearchVector(StringAgg('steps__ingredients__food__name', delimiter=' '), weight='B', config=language) + SearchVector(StringAgg('steps__ingredients__food__name', delimiter=' '), weight='B', config=language)
+ SearchVector(StringAgg('keywords__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) search_rank = SearchRank(search_vectors, search_query)
queryset = ( queryset = (
queryset.annotate( queryset.annotate(
search=search_vectors, search=search_vectors,
rank=search_rank,) rank=search_rank + trigram,
.filter(search=search_query) )
.filter(
search_vector=search_query
)
.order_by('-rank')) .order_by('-rank'))
else: else:
queryset = queryset.filter(name__icontains=search_string) queryset = queryset.filter(name__icontains=search_string)