Skip to content

Commit

Permalink
Fix search to ignore accents and case in trigram similarity
Browse files Browse the repository at this point in the history
  • Loading branch information
smdsgn committed Sep 30, 2024
1 parent 711d10e commit 0bbc73a
Show file tree
Hide file tree
Showing 5 changed files with 10 additions and 5 deletions.
3 changes: 2 additions & 1 deletion public_data/models/administration/Commune.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from django.contrib.gis.db import models
from django.contrib.postgres.search import TrigramSimilarity
from django.core.validators import MaxValueValidator, MinValueValidator
from django.db.models.functions import Lower

from public_data.models.cerema import Cerema
from public_data.models.enums import SRID
Expand Down Expand Up @@ -87,7 +88,7 @@ def get_official_id(self) -> str:

@classmethod
def search(cls, needle, region=None, departement=None, epci=None):
qs = cls.objects.annotate(similarity=TrigramSimilarity("name", needle))
qs = cls.objects.annotate(similarity=TrigramSimilarity(Lower("name__unaccent"), needle.lower()))

if needle.isdigit():
qs = cls.objects.filter(insee__icontains=needle)
Expand Down
3 changes: 2 additions & 1 deletion public_data/models/administration/Departement.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from django.contrib.gis.db import models
from django.contrib.postgres.fields import ArrayField
from django.contrib.postgres.search import TrigramSimilarity
from django.db.models.functions import Lower

from public_data.models.cerema import Cerema
from public_data.models.enums import SRID
Expand Down Expand Up @@ -48,7 +49,7 @@ def __str__(self):

@classmethod
def search(cls, needle, region=None, departement=None, epci=None):
qs = cls.objects.annotate(similarity=TrigramSimilarity("name", needle))
qs = cls.objects.annotate(similarity=TrigramSimilarity(Lower("name__unaccent"), needle.lower()))
qs = qs.filter(similarity__gt=0.15) # Filtrer par un score minimum de similarité
qs = qs.order_by("-similarity") # Trier par score décroissant

Expand Down
3 changes: 2 additions & 1 deletion public_data/models/administration/Epci.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from django.apps import apps
from django.contrib.gis.db import models
from django.contrib.postgres.search import TrigramSimilarity
from django.db.models.functions import Lower

from public_data.models.enums import SRID
from utils.db import IntersectManager
Expand Down Expand Up @@ -58,7 +59,7 @@ def __str__(self):

@classmethod
def search(cls, needle, region=None, departement=None, epci=None):
qs = cls.objects.annotate(similarity=TrigramSimilarity("name", needle))
qs = cls.objects.annotate(similarity=TrigramSimilarity(Lower("name__unaccent"), needle.lower()))
qs = qs.filter(similarity__gt=0.15) # Filtrer par un score minimum de similarité
qs = qs.order_by("-similarity") # Trier par score décroissant

Expand Down
3 changes: 2 additions & 1 deletion public_data/models/administration/Region.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from django.apps import apps
from django.contrib.gis.db import models
from django.contrib.postgres.search import TrigramSimilarity
from django.db.models.functions import Lower

from public_data.models.cerema import Cerema
from public_data.models.enums import SRID
Expand Down Expand Up @@ -42,7 +43,7 @@ def get_ocsge_millesimes(self) -> set:

@classmethod
def search(cls, needle, region=None, departement=None, epci=None):
qs = cls.objects.annotate(similarity=TrigramSimilarity("name", needle))
qs = cls.objects.annotate(similarity=TrigramSimilarity(Lower("name__unaccent"), needle.lower()))
qs = qs.filter(similarity__gt=0.15) # Filtrer par un score minimum de similarité
qs = qs.order_by("-similarity") # Trier par score décroissant

Expand Down
3 changes: 2 additions & 1 deletion public_data/models/administration/Scot.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from django.contrib.gis.db import models
from django.contrib.postgres.search import TrigramSimilarity
from django.db.models.functions import Lower

from public_data.models.cerema import Cerema
from public_data.models.enums import SRID
Expand Down Expand Up @@ -49,7 +50,7 @@ def get_official_id(self) -> str:

@classmethod
def search(cls, needle, region=None, departement=None, epci=None):
qs = cls.objects.annotate(similarity=TrigramSimilarity("name", needle))
qs = cls.objects.annotate(similarity=TrigramSimilarity(Lower("name__unaccent"), needle.lower()))
qs = qs.filter(similarity__gt=0.15) # Filtrer par un score minimum de similarité
qs = qs.order_by("-similarity") # Trier par score décroissant

Expand Down

0 comments on commit 0bbc73a

Please sign in to comment.