В 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