Широкое решение этой проблемы - использовать функцию PG ts_rewrite для настройки таблицы псевдонимов, которая работает для альтернативных совпадений (см. Перезапись запроса ). Это охватывает случаи, подобные вашему выше, а также обрабатывает совершенно разные случаи, такие как поиск tree rat
и получение результатов для squirrel
и т. Д.
Полная информация и объяснение по этой ссылке, но суть в том, что вы можете настроить таблицу псевдонимов с 2 столбцами ts_query и передать запрос этой таблицы в свой поиск, например, так:
CREATE TABLE aliases (t tsquery primary key, s tsquery);
INSERT INTO aliases VALUES(to_tsquery('supernovae'), to_tsquery('supernovae|sn'));
SELECT ts_rewrite(to_tsquery('supernovae & crab'), 'SELECT * FROM aliases');
Результатом является окончательный запрос, который выглядит примерно так:
WHERE vectors @@ ts_rewrite(to_tsquery('supernovae & crab'), 'SELECT * FROM aliases')
Это похоже на настройку тезауруса в PG, но работает без полного переиндексации при каждом добавлении чего-либо. Когда вы сталкиваетесь с небольшими вариациями правописания и случаями «когда я ищу это, я ожидаю таких результатов», очень легко просто быстро добавить их в таблицу. Вы можете добавить больше столбцов в эту таблицу, а также, если запрос, основанный на ts_rewrite
, возвращает 2 ожидаемых to_tsquery
столбца.
Когда вы изучите эту документацию, вы увидите также примеры для настройки производительности. Существует баланс между использованием триграммы для чистой скорости и вектором / запросом / перезаписью для надежности.