mirror of
https://github.com/TandoorRecipes/recipes.git
synced 2026-01-10 00:28:22 -05:00
add trigrams to search rank
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user