Full-text search using postgresql #162

Merged
Oleg-Komarov merged 10 commits from fts into main 2024-06-03 20:07:23 +02:00
2 changed files with 43 additions and 5 deletions
Showing only changes of commit ac52988ea7 - Show all commits

View File

@ -0,0 +1,40 @@
# Generated by Django 4.2.11 on 2024-06-03 17:18
from django.db import migrations
def create_indexes(apps, schema_editor):
if schema_editor.connection.vendor != 'postgresql':
return
with schema_editor.connection.cursor() as cursor:
cursor.execute(
"""
CREATE INDEX extensions_fts ON extensions_extension USING
gin ((to_tsvector('english', name) || ' ' || to_tsvector('english', description)))
"""
)
cursor.execute(
"""
CREATE INDEX extensions_trgm_gin ON extensions_extension USING
gin((((name)::text || ' '::text) || description) gin_trgm_ops);
"""
)
def delete_indexes(apps, schema_editor):
if schema_editor.connection.vendor != 'postgresql':
return
with schema_editor.connection.cursor() as cursor:
cursor.execute('drop index extensions_fts')
cursor.execute('drop index extensions_trgm_gin')
class Migration(migrations.Migration):
dependencies = [
('extensions', '0032_extension_extensions__is_list_765936_idx_and_more'),
]
operations = [
migrations.RunPython(create_indexes, delete_indexes)
]

View File

@ -1,7 +1,6 @@
from collections import OrderedDict from collections import OrderedDict
import logging import logging
from django.conf import settings
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.db import connection from django.db import connection
from django.db.models import Count, Q from django.db.models import Count, Q
@ -111,8 +110,9 @@ class SearchView(ListedExtensionsView):
return queryset return queryset
# WARNING: full-text search support only on postgres # WARNING: full-text search support only on postgres
# using DEBUG as a shortcut for checking if we run on postgres vs sqlite if connection.vendor == 'postgresql':
if settings.DEBUG: queryset = self.postgres_fts(queryset, search_query)
else:
filter = Q() filter = Q()
for token in search_query.split(): for token in search_query.split():
filter &= ( filter &= (
@ -122,8 +122,6 @@ class SearchView(ListedExtensionsView):
| Q(latest_version__tags__name__icontains=token) | Q(latest_version__tags__name__icontains=token)
) )
queryset = queryset.filter(filter).distinct() queryset = queryset.filter(filter).distinct()
else:
queryset = self.postgres_fts(queryset, search_query)
return queryset return queryset
def postgres_fts(self, queryset, search_query): def postgres_fts(self, queryset, search_query):