From 13b5827cb2fc30de0bf32cef45406edd83580cbd Mon Sep 17 00:00:00 2001 From: smilerz Date: Sun, 11 Apr 2021 20:17:54 -0500 Subject: [PATCH] added multi-language support to FTS --- cookbook/managers.py | 24 +++++++++++++++++++----- cookbook/signals.py | 7 +++++-- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/cookbook/managers.py b/cookbook/managers.py index 64addf4dc..baa871d3a 100644 --- a/cookbook/managers.py +++ b/cookbook/managers.py @@ -3,22 +3,36 @@ from django.contrib.postgres.search import ( SearchQuery, SearchRank, SearchVector, TrigramSimilarity, ) from django.db import models +from django.utils import translation + +DICTIONARY = { + # TODO find custom dictionaries - maybe from here https://www.postgresql.org/message-id/CAF4Au4x6X_wSXFwsQYE8q5o0aQZANrvYjZJ8uOnsiHDnOVPPEg%40mail.gmail.com + # 'hy': 'Armenian', + # 'ca': 'Catalan', + # 'cs': 'Czech', + 'nl': 'dutch', + 'en': 'english', + 'fr': 'french', + 'de': 'german', + 'it': 'italian', + # 'lv': 'Latvian', + 'es': 'spanish', +} # TODO add search highlighting # TODO add language support # TODO add schedule index rebuild -# TODO add admin function to rebuild index class RecipeSearchManager(models.Manager): - def search(self, search_text, space): + language = DICTIONARY.get(translation.get_language(), 'simple') search_query = SearchQuery( - search_text, config='english' + search_text, config=language ) search_vectors = ( SearchVector('search_vector') - + SearchVector(StringAgg('steps__ingredients__food__name', delimiter=' '), weight='B', config='english') - + SearchVector(StringAgg('keywords__name', delimiter=' '), weight='B', config='english')) + + SearchVector(StringAgg('steps__ingredients__food__name', delimiter=' '), weight='B', config=language) + + SearchVector(StringAgg('keywords__name', delimiter=' '), weight='B', config=language)) search_rank = SearchRank(search_vectors, search_query) # the results from trigram were really, really bad # trigram = ( diff --git a/cookbook/signals.py b/cookbook/signals.py index b282d9aed..fab9a1238 100644 --- a/cookbook/signals.py +++ b/cookbook/signals.py @@ -1,8 +1,10 @@ from django.contrib.postgres.search import SearchVector from django.db.models.signals import post_save from django.dispatch import receiver +from django.utils import translation from cookbook.models import Recipe +from cookbook.managers import DICTIONARY @receiver(post_save, sender=Recipe) @@ -14,9 +16,10 @@ def update_recipe_search_vector(sender, instance=None, created=False, **kwargs): if hasattr(instance, '_dirty'): return + language = DICTIONARY.get(translation.get_language(), 'simple') instance.search_vector = ( - SearchVector('name', weight='A', config='english') - + SearchVector('description', weight='C', config='english') + SearchVector('name', weight='A', config=language) + + SearchVector('description', weight='C', config=language) ) try: