updated search v2 with full text search

This commit is contained in:
smilerz
2021-04-21 14:42:10 -05:00
parent 64d7f71d86
commit d625e07bd7
2 changed files with 78 additions and 30 deletions

View File

@ -3,6 +3,7 @@ from django.contrib.postgres.search import (
SearchQuery, SearchRank, SearchVector, TrigramSimilarity,
)
from django.db import models
from django.db.models import Q
from django.utils import translation
DICTIONARY = {
@ -27,21 +28,44 @@ class RecipeSearchManager(models.Manager):
def search(self, search_text, space):
language = DICTIONARY.get(translation.get_language(), 'simple')
search_query = SearchQuery(
search_text, config=language
search_text,
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))
search_rank = SearchRank(search_vectors, search_query)
# the results from trigram were really, really bad
# trigram = (
# TrigramSimilarity('name', search_text)
# + TrigramSimilarity('description', search_text)
# + TrigramSimilarity('steps__ingredients__food__name', search_text)
# + TrigramSimilarity('keywords__name', search_text))
# USING TRIGRAM BREAKS WEB SEARCH
# ADDING MULTIPLE TRIGRAMS CREATES DUPLICATE RESULTS
# DISTINCT NOT COMPAITBLE WITH ANNOTATE
# trigram_name = (TrigramSimilarity('name', search_text))
# trigram_description = (TrigramSimilarity('description', search_text))
# trigram_food = (TrigramSimilarity('steps__ingredients__food__name', search_text))
# trigram_keyword = (TrigramSimilarity('keywords__name', search_text))
# adding additional trigrams created duplicates
# + TrigramSimilarity('description', search_text)
# + TrigramSimilarity('steps__ingredients__food__name', search_text)
# + TrigramSimilarity('keywords__name', search_text)
return (
self.get_queryset()
.annotate(search=search_vectors, rank=search_rank)
.filter(search=search_query)
.annotate(
search=search_vectors,
rank=search_rank,
#trigram=trigram_name+trigram_description+trigram_food+trigram_keyword
# trigram_name=trigram_name,
# trigram_description=trigram_description,
# trigram_food=trigram_food,
# trigram_keyword=trigram_keyword
)
.filter(
Q(search=search_query)
# | Q(trigram_name__gt=0.1)
# | Q(name__icontains=search_text)
# | Q(trigram_name__gt=0.2)
# | Q(trigram_description__gt=0.2)
# | Q(trigram_food__gt=0.2)
# | Q(trigram_keyword__gt=0.2)
)
.order_by('-rank'))