Заставить 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+.
Подробности: