В PostgreSQL префикс подстановки полный текст

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

кажется достаточно простым иметь подстановочный знак postfix после поискового запроса, однако я не могу понять, как указать подстановочный знак префикса.

например, я могу выполнить поиск постфикс достаточно легко, используя что-то вроде..

SELECT "t1".* 
FROM "t1" 
WHERE (to_tsvector('simple', "t1"."city") @@ to_tsquery('simple', 'don:*') )

должен возвращать результаты, соответствующие "London"

однако я не могу выполнить поиск префикса как...

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:*') )

Я могу использовать подобное условие, однако я надеялся извлечь выгоду из производительности полнотекстовых функций поиска в Postgres.

2 ответов


полнотекстовый поиск хорош для поиска слов, а не подстрок.

для поиска подстроки лучше использовать like '%don%' с pg_trgm расширение доступно из PostgreSQL 9.1 и using gin (column_name gin_trgm_ops) или using gist (column_name gist_trgm_ops) индексы. Но ваш индекс будет очень большим (даже в несколько раз больше, чем ваша таблица) и производительность записи не очень хорошая.

здесь очень хороший пример использования pg_trgm для поиска подстроки on выберите * из блога depesz.


один дикий и сумасшедший способ сделать это - создать индекс tsvector всех ваших документов, перевернутый. И отмените свои запросы для поиска postfix.

это по существу то, что Solr делает со своим ReversedWildcardFilterFactory

select
reverse('brown fox')::tsvector @@ (reverse('rown') || ':*')::tsquery --true