Рубрики
Без рубрики

PostgreSQL Text Search в Django

Дирижер колледжа дает образовательным консультантам и консультантам доступ к информации тысяч … Tagged с Python, Django, Postgres.

Дирижер колледжа дает образовательным консультантам и консультантам доступ к информации тысяч колледжей и университетов в США. Самый естественный метод для поиска этих школ – это поиск. Поскольку дирижер колледжа продолжает новейшие версии Django , Я смог добавить поиск с помощью PostgreSQL’s Полный текстовый поиск это подвергается воздействию Джанго Орма. Функции поиска не являются идеальными, но они быстро дают результаты и избегают более целенаправленного инструмента, такого как Elasticsearch. Этот пост будет охватывать некоторые преимущества и недостатки использования этих функций Django.

Поиск способности колледжа рассказывает о поиске имен университетов. Это означает, что данные имеют несколько интересных характеристик:

  1. Все результаты поиска будут на фразы как Университет Вирджинии или Университет Джона Хопкинса Анкет
  2. Большой процент терминов практически бесполезен для поиска (например, University , College ).

Когда я просмотрел параметры поиска, которые Джанго раскрывает в PostgreSQL, я нашел два разумных подхода: Полный текстовый поиск и Сходство триграммы Анкет

Давайте посмотрим на тот, который я не Выберите первое.

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

Сходство триграммы работает путем разбивания данных в трех буквенных группах. Используя некоторые вычисления, PostgreSQL может сравнить триграммы и попытаться вывести вывод, каким должен быть результат. Эта техника отлично подходит для разрешения опечаток (которые иногда называют «нечетким сопоставлением»). Например, если вы ищете фрукты и тип Appel , поиск триграмм найдет ожидаемый результат Apple Анкет

К сожалению, я обнаружил, что триграммы эффектно провалились для длинных фраз. Мне понравилась идея нечеткого сопоставления, поэтому я начал с опции триграммы. Когда я проверил функциональность, она вообще не сработала. Не только Вирджиния не найти Университет Вирджинии , но поиск Вирджиния будет Также не найти школу. Я считаю, что эта неудача произошла, потому что большая часть полного имени школы отсутствовала. Кто хочет напечатать Массачустовый колледж фармацевтических и медицинских наук Чтобы извлечь выгоду из неправильного написания Массачусетса? Ответ: Никто.

Давайте попробуем вариант второй.

Полный текстовый поиск

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

Вот код для создания запроса:

# `search` is the user's provided search string.
terms = [SearchQuery(term) for term in search.split()]
# `name` is where the name of the school is stored in the model.
vector = SearchVector('name')
query = functools.reduce(operator.or_, terms)
queryset = queryset.annotate(
    rank=SearchRank(vector, query)).order_by('-rank')
queryset = queryset.filter(rank__gte=0.04)

Использование этой стратегии соединения с или оператором имела еще одну дополнительную пробку. Был уровень нежелательных результатов, который мог бы не иметь ничего общего с поисковой фразой.

Результат включает в себя ранную аннотацию, которая мера того, насколько хорош матч для запроса. Осмотр ранга показал, что весь мусор был ниже числового порога. Поскольку список школ США меняется крайне редко, я решил отрезать все, что ниже порога (который оказался близок к 0,04 ). Если набор данных часто меняется, я бы не стал доверять этому магическому номеру; Но я получаю выгоду от неизменной природы моего набора данных.

Есть еще проблемы с этим методом поиска, о котором я не без ума:

  1. Поскольку триграммы не являются частью поиска, результаты не появятся, если термин не будет написан правильно. Это раздражает.
  2. Частичный поиск одинаково недействителен. Например, поиск Вирг не найдет никаких результатов. Также раздражает.

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

Эта статья впервые появилась на mattlayman.com Анкет

Оригинал: “https://dev.to/mblayman/postgresql-text-search-in-django-34l3”