Skip to content

Commit ca3eef4

Browse files
committed
Add the option of using trigram word similarity for NGO and Cause search
1 parent 87ca873 commit ca3eef4

2 files changed

Lines changed: 30 additions & 7 deletions

File tree

backend/donations/views/common/search.py

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
from typing import Any
22

33
from 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+
)
511
from django.db.models import Q, QuerySet
612
from django.db.models.functions import Greatest
713
from 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

120140
class DonorSearchMixin(CommonSearchMixin):

backend/redirectioneaza/settings/feature_flags.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
from .base import DEBUG
22
from .environment import env
33

4+
# Search tweaks
5+
ENABLE_NGO_SEARCH_WORD_SIMILARITY = env.bool("ENABLE_NGO_SEARCH_WORD_SIMILARITY", True)
6+
47
# Feature flags
58
ENABLE_FLAG_CONTACT = env.bool("ENABLE_FLAG_CONTACT", False)
69
ENABLE_MULTIPLE_FORMS = env.bool("ENABLE_MULTIPLE_FORMS", True)

0 commit comments

Comments
 (0)