Заставить postgres полнотекстовый поиск (tsvector) вести себя как ILIKE для поиска внутри слов?

Допустим, я ищу "Blerg". И у меня есть предмет с именем SomethingblergSomething.

Если я сделаю поиск ILIKE в postgres (и rails), как это:

where("name ILIKE ?", "%#{ 'Blerg' }%")

Он вернет результат SomethingBlergSomething, потому что он содержит Blerg.

Есть ли способ заставить более быстрый tsvector выполнять подобный стиль поиска внутри слова:

where("(to_tsvector('english', name) @@ to_tsquery(?))", ('Blerg' + ':*'))

Приведенный выше запрос не будет возвращать 'SomethingBlergSomething'.

Итак, как мне заставить tvector вести себя как ILIKE при поиске внутри слов.

1 ответ

Решение

Знаете ли вы о поиске триграмм, предоставляемых дополнительным модулем pg_trgm? Это кажется более подходящим для вашего варианта использования, чем текстовый поиск.

Имея индекс триграммы (GIN или GiST), вы можете использовать свой оригинальный ILIKE предикат и получить поддержку индекса для него. Для этого вам нужен Postgres 9.1+.

Подробности:

Другие вопросы по тегам