Made the search filter have a calculated threshold with a lower threshold for small query strings and a higher threshold for large query strings.
All checks were successful
StarFields Django Rest Framework Generics / build (push) Successful in 12s
All checks were successful
StarFields Django Rest Framework Generics / build (push) Successful in 12s
This commit is contained in:
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "starfields-drf-generics"
|
name = "starfields-drf-generics"
|
||||||
version = "0.2.6"
|
version = "0.2.7"
|
||||||
authors = [
|
authors = [
|
||||||
{ name="Anastasios Svolis", email="support@starfields.gr" },
|
{ name="Anastasios Svolis", email="support@starfields.gr" },
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -14,6 +14,15 @@ from django.db.models.functions import Concat
|
|||||||
|
|
||||||
# TODO the dev pages are not done
|
# TODO the dev pages are not done
|
||||||
|
|
||||||
|
def calculate_threshold(query, min_threshold, max_threshold):
|
||||||
|
query_threshold = len(query)/300
|
||||||
|
if query_threshold < min_threshold:
|
||||||
|
return min_threshold
|
||||||
|
if max_threshold < query_threshold:
|
||||||
|
return max_threshold
|
||||||
|
return query_threshold
|
||||||
|
|
||||||
|
|
||||||
def search_smart_split(search_terms):
|
def search_smart_split(search_terms):
|
||||||
"""generator that first splits string by spaces, leaving quoted phrases together,
|
"""generator that first splits string by spaces, leaving quoted phrases together,
|
||||||
then it splits non-quoted phrases by commas.
|
then it splits non-quoted phrases by commas.
|
||||||
@@ -516,6 +525,7 @@ class TrigramSearchFilter(BaseFilterBackend):
|
|||||||
try:
|
try:
|
||||||
# Attempt postgresql's full text search
|
# Attempt postgresql's full text search
|
||||||
from django.contrib.postgres.search import TrigramStrictWordSimilarity
|
from django.contrib.postgres.search import TrigramStrictWordSimilarity
|
||||||
|
threshold = calculate_threshold(query, 0.02, 0.12)
|
||||||
queryset = queryset.annotate(
|
queryset = queryset.annotate(
|
||||||
search_field=Concat(
|
search_field=Concat(
|
||||||
*search_fields,
|
*search_fields,
|
||||||
@@ -523,7 +533,7 @@ class TrigramSearchFilter(BaseFilterBackend):
|
|||||||
)).annotate(
|
)).annotate(
|
||||||
similarity=TrigramStrictWordSimilarity(
|
similarity=TrigramStrictWordSimilarity(
|
||||||
'search_field', query)
|
'search_field', query)
|
||||||
).filter(similarity__gt=0.05)
|
).filter(similarity__gt=threshold)
|
||||||
|
|
||||||
except ImportError:
|
except ImportError:
|
||||||
# Perform very simple sqlite compatible search
|
# Perform very simple sqlite compatible search
|
||||||
|
|||||||
Reference in New Issue
Block a user