У меня есть стол в постгерсе 8.1 db с информацией о приблизительно 370 000 клиентов. В эту таблицу входят поля sn (фамилия) и gn (данное имя). Я бы хотел, чтобы пользователи могли искать имена пользователей с помощью формы или просто. Моя первая попытка построить запрос было так:Как реализовать поиск полного имени в postgres
SELECT sn || ', ' || gn as name from users
WHERE sn || ' ' || gn like '%Johnson David%'
or gn || ' ' || sn like '%Johnson David%'
Это работало хорошо, но довольно медленно, с тактовой частотой 600/623 мс. Чтобы оптимизировать, я создал индекс только для поля sn, так как я догадался, что поле gn будет содержать столько дублирования, что бесполезно для индексирования. К сожалению, индексная фамилия вообще не улучшала производительность, поскольку запрос не использовал индекс.
Seq Scan on users (cost=0.00..18296.06 rows=1 width=64) (actual time=57.935..588.755 rows=8 loops=1)
Я думаю, что причиной этого является то, что описано в this thread. Я рассмотрел использование многоколоночного индекса, но я догадался, что это будет означать, что я мог бы искать только один из двух стилей, о которых я упоминал выше, то есть, но не обоих.
Я также рассмотрел возможность создания полного текстового индекса, но он кажется непригодным для значений имени, поскольку я получаю много последствий и так далее, что не имеет значения. Есть ли у кого-нибудь предложения по стратегии индексирования? Похоже, это должно быть довольно распространенным случаем.
Trigrams кажется хорошим решением, но мои коллеги не очень увлекаются обновлением PostGres, так как мы могли бы нарушить некоторые из наших других кодов. –