Обозначение префикса Postgresql для полного текста
Я пытаюсь запустить полнотекстовый запрос, используя Postgresql, который может обслуживать частичные совпадения с помощью подстановочных знаков.
Кажется, достаточно легко иметь подстановочный шаблон postfix после поискового запроса, однако я не могу понять, как указать шаблон подстановки.
Например, я могу выполнить постфиксный поиск достаточно легко, используя что-то вроде.
SELECT "t1".*
FROM "t1"
WHERE (to_tsvector('simple', "t1"."city") @@ to_tsquery('simple', 'don:*') )
должен возвращать результаты, соответствующие "Лондон"
Однако я не могу сделать префиксный поиск, например...
SELECT "t1".*
FROM "t1"
WHERE (to_tsvector('simple', "t1"."city") @@ to_tsquery('simple', ':*don') )
В идеале я хотел бы иметь подстановочный знак, предваряющий фронт и конец поискового термина, что-то вроде...
SELECT "t1".*
FROM "t1"
WHERE (to_tsvector('simple', "t1"."city") @@ to_tsquery('simple', ':*don:*') )
Я могу использовать условие LIKE, однако я надеялся извлечь выгоду из производительности функций полнотекстового поиска в Postgres.
Ответы
Ответ 1
Полнотекстовый поиск хорош для поиска слов, а не подстрок.
Для поиска подстрок вам лучше использовать like '%don%'
с расширением pg_trgm
, доступным из индексов PostgreSQL 9.1 и using gin (column_name gin_trgm_ops)
или using gist (column_name gist_trgm_ops)
. Но ваш индекс будет очень большим (даже в несколько раз большим, чем ваш стол), и производительность записи не очень хорошая.
Здесь очень хороший пример использования pg_trgm для поиска подстроки на select * из блога depesz.
Ответ 2
Один дикий и сумасшедший способ сделать это - создать индекс tsvector всех ваших документов, обратный. И также отмените свои запросы для поиска постов.
Это, по сути, то, что делает Solr с ReversedWildcardFilterFactory
select
reverse('brown fox')::tsvector @@ (reverse('rown') || ':*')::tsquery --true