Как искать русский текст в django?
Есть необходимость организовать поиск русских слов. Из документации к django понятно, что при использовании базы SQLite поиск ведется с учетом регистра. Как можно это обойти? Вот такой пример использования поиска:
class ProductListView(ListView):
model = Product
def get_queryset(self):
qs = super().get_queryset()
get_params = self.request.GET.dict()
# search
if get_params.get('q'):
qs = qs.filter(product_title__icontains=get_params.get('q'))
Ответы (2 шт):
Используйте __iregex - Регистронезависимая проверка регулярным выражением.
Entry.objects.get(product_title__iregex=r'^[а-яА-Я]/$').all()
Ссылка на документацию: https://djbook.ru/rel1.9/ref/models/querysets.html
Итак, как мы знаем, регистронезависимого поиска не в ASCII-символах в sqlite3 нет. Поиск решения приводит к расширению ICU. Для начала надо его скомпилировать. Устанавливаем пакеты:
sudo apt update
sudo apt install libicu-dev libsqlite3-dev pkg-config
Скачиваем icu.c и компилируем:
gcc -fPIC -shared icu.c `pkg-config --libs --cflags icu-uc icu-io` -o libicu.so
Почему мы переименовали libSqliteIcu.so из инструкции в libicu.so описано здесь (иначе будет возникать ошибка). Переносим библиотеку в папку с проектом (я расположил ее вместе с manage.py) и подключаем к нашему django-приложению:
# core/utils.py
import os
from django.conf import settings
def load_icu(connection, **kwargs):
if connection.vendor != 'sqlite': # проверяем, что подключаемая база - sqlite3
return
connection.connection.enable_load_extension(True)
connection.connection.load_extension(
os.path.join(settings.BASE_DIR, 'libicu.so'))
# core/apps.py
from django.apps import AppConfig
from django.db.backends.signals import connection_created
from core.utils import load_icu
class CoreConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "core"
def ready(self):
connection_created.connect(load_icu)
Теперь регистронезависимый поиск работает!
Для Windows компилируем libicu.dll в MINGW64, предварительно установив необходимые пакеты:
pacman -S mingw-w64-x86_64-cmake
pacman -S mingw-w64-x86_64-icu