11from typing import Any
22
33from django .conf import settings
4- from django .contrib .postgres .search import SearchQuery , SearchRank , SearchVector , TrigramSimilarity
4+ from django .contrib .postgres .search import (
5+ SearchQuery ,
6+ SearchRank ,
7+ SearchVector ,
8+ TrigramSimilarity ,
9+ TrigramWordSimilarity ,
10+ )
511from django .db .models import Q , QuerySet
612from django .db .models .functions import Greatest
713from django .utils .translation import gettext_lazy as _
@@ -52,7 +58,7 @@ def search(self, queryset: QuerySet[Any] | None = None) -> QuerySet:
5258
5359 if not queryset :
5460 if not self .queryset :
55- return queryset .none ()
61+ return queryset .none () # TODO: this looks weird
5662 queryset = self .queryset
5763
5864 if not query or len (query ) < settings .SEARCH_QUERY_MIN_LENGTH :
@@ -73,12 +79,19 @@ def get_search_results(cls, queryset: QuerySet, query: str, language_code: str)
7379 search_vector : SearchVector = ConfigureSearch .vector (search_fields , language_code )
7480 search_query : SearchQuery = ConfigureSearch .query (query , language_code )
7581
82+ if settings .ENABLE_NGO_SEARCH_WORD_SIMILARITY :
83+ trigram_similarity = TrigramWordSimilarity (query , "name" )
84+ similarity_threshold = 0.4
85+ else :
86+ trigram_similarity = TrigramSimilarity ("name" , query )
87+ similarity_threshold = 0.3
88+
7689 ngos : QuerySet [Ngo ] = (
7790 queryset .annotate (
7891 rank = SearchRank (search_vector , search_query ),
79- similarity = TrigramSimilarity ( "name" , query ) ,
92+ similarity = trigram_similarity ,
8093 )
81- .filter (Q (rank__gte = 0.3 ) | Q (similarity__gt = 0.3 ))
94+ .filter (Q (rank__gte = 0.3 ) | Q (similarity__gt = similarity_threshold ))
8295 .order_by ("name" )
8396 .distinct ("name" )
8497 )
@@ -93,12 +106,19 @@ def get_search_results(cls, queryset: QuerySet, query: str, language_code: str)
93106 search_vector : SearchVector = ConfigureSearch .vector (search_fields , language_code )
94107 search_query : SearchQuery = ConfigureSearch .query (query , language_code )
95108
109+ if settings .ENABLE_NGO_SEARCH_WORD_SIMILARITY :
110+ trigram_similarity = TrigramWordSimilarity (query , "name" )
111+ similarity_threshold = 0.4
112+ else :
113+ trigram_similarity = TrigramSimilarity ("name" , query )
114+ similarity_threshold = 0.3
115+
96116 causes : QuerySet [Cause ] = (
97117 queryset .annotate (
98118 rank = SearchRank (search_vector , search_query ),
99- similarity = TrigramSimilarity ( "name" , query ) ,
119+ similarity = trigram_similarity ,
100120 )
101- .filter (Q (rank__gte = 0.3 ) | Q (similarity__gt = 0.3 ))
121+ .filter (Q (rank__gte = 0.3 ) | Q (similarity__gt = similarity_threshold ))
102122 .order_by ("name" )
103123 .distinct ("name" )
104124 )
@@ -114,7 +134,7 @@ def get_search_results(cls, queryset: QuerySet, query: str, language_code: str)
114134
115135 searched_causes = CauseSearchMixin .get_search_results (queryset , query , language_code )
116136
117- return searched_causes | ngos_causes
137+ return ngos_causes | searched_causes
118138
119139
120140class DonorSearchMixin (CommonSearchMixin ):
0 commit comments