Поиск в PostgreSQL

Сходство триграмм

Поиск trigram_similar позволяет выполнять триграммный поиск, измеряя количество общих триграмм (трех последовательных символов), используя специальное расширение PostgreSQL. Триграммный поиск задается выражением и возвращает результаты, у которых измерение сходства больше текущего порога сходства.

Чтобы использовать его, добавьте 'django.contrib.postgres' в свой INSTALLED_APPS и активируйте pg_trgm extension на PostgreSQL. Вы можете установить расширение с помощью операции миграции TrigramExtension.

Поиск trigram_similar можно использовать для CharField и TextField:

>>> City.objects.filter(name__trigram_similar="Middlesborough")
['<City: Middlesbrough>']
New in Django 4.0.

Поиск trigram_word_similar позволяет выполнять поиск триграммного сходства слов с помощью специального расширения PostgreSQL. Его можно приблизительно понимать как измерение наибольшего числа триграмм, общих для параметра и любой подстроки поля. Триграммный поиск слов задается выражением и возвращает результаты, у которых измерение сходства слов больше текущего порога сходства.

Чтобы использовать его, добавьте 'django.contrib.postgres' в свой INSTALLED_APPS и активируйте pg_trgm extension на PostgreSQL. Вы можете установить расширение с помощью операции миграции TrigramExtension.

Поиск trigram_word_similar можно использовать на CharField и TextField:

>>> Sentence.objects.filter(name__trigram_word_similar='Middlesborough')
['<Sentence: Gumby rides on the path of Middlesbrough>']

Unaccent

Поиск unaccent позволяет выполнять поиск без учета ударения с помощью специального расширения PostgreSQL.

Этот поиск реализован с помощью Transform, поэтому его можно объединить в цепочку с другими функциями поиска. Чтобы использовать его, вам нужно добавить 'django.contrib.postgres' в ваш INSTALLED_APPS и активировать unaccent extension on PostgreSQL. Операция миграции UnaccentExtension доступна, если вы хотите выполнить эту активацию с помощью миграций).

Поиск unaccent можно использовать для CharField и TextField:

>>> City.objects.filter(name__unaccent="México")
['<City: Mexico>']

>>> User.objects.filter(first_name__unaccent__startswith="Jerem")
['<User: Jeremy>', '<User: Jérémy>', '<User: Jérémie>', '<User: Jeremie>']

Предупреждение

В большинстве случаев поиск unaccent должен работать нормально. Однако запросы, использующие этот фильтр, обычно выполняют полное сканирование таблицы, что может быть медленным для больших таблиц. В таких случаях целесообразно использовать специальные инструменты полнотекстового индексирования.

Вернуться на верх