Обозначение префикса 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