Задать вопрос

Как победить полнотекстовый поиск Postgres?

Не работает полнотекстовый поиск, если я использую поиск по столбцу search_index::tsvector, который получается из поля description и title статьи блога.
Миграция
class AddFtsToBlogs < ActiveRecord::Migration[6.1]
  def change
    add_column :blogs, :search_index, :tsvector, null: true
    add_index :blogs, :search_index, using: :gin
  end
end

В базе:
CREATE TABLE IF NOT EXISTS public.blogs
(
    id bigint NOT NULL DEFAULT nextval('blogs_id_seq'::regclass),
    ...
    search_index tsvector,
    ...
)

CREATE INDEX index_blogs_on_search_index
    ON public.blogs USING gin
    (search_index)
    TABLESPACE pg_default;


Содержимое что лежит в search_index моей единственной статьи в блоге:
'30':17 '5':75 '6':76 '70':39 'lepus':4 'австрал':12 'антарктид':14 'беззащитн':100 'беляк':175 'брачн':142 'бьют':154 'везд':10 'весн':139 'веществ':120 'вид':18 'вод':172 'враг':91,105 'вред':131 'вследств':85 'встают':149 'гибнет':89 'глаз':68 'гнезд':57 'д':138 'двига':33 'дела':111 'длин':20,27 'дне':77 'достига':37 'древесн':125 'друг':155,156 'живут':43 'задн':28,151 'зайц':1,2,42,51,94 'зайцев':8 'зайчат':61,88 'зат':79 'заяц':176,179 'заяц-тола':178 'значительн':130 'зрен':92 'ключиц':26 'км':40 'кор':126 'коротк':22 'крайн':113 'кролик':50 'кром':11 'лап':29,152 'лат':3 'лиш':80 'люб':133 'маньчжурск':177 'мат':70 'млекопита':108 'многочислен':104 'наступлен':141 'небольш':59 'недоразвит':25 'ним':73 'нор':54 'обонян':96 'овощ':124 'ожесточен':145 'окол':16 'особен':132 'оста':71 'осторожн':114,162 'открыт':67 'отлич':48 'отлича':19 'отношен':102 'пар':46 'передн':157 'петрушк':134 'пита':117 'поднят':23 'позволя':31 'поодиночк':44 'превосходн':99 'прибега':82 'принос':129 'прыжк':34 'птиц':110 'развит':63 'различн':118 'распростран':9 'растен':123 'растительн':119 'реп':135 'род':5 'рожда':62 'росс':171 'роют':53 'русак':35,173 'самок':148 'самц':144 'сезон':143 'семейств':7 'скорост':38 'скрытн':116 'слаб':95 'слух':98 'сооружа':56 'состяза':146 'т':137 'территор':170 'теря':161 'тола':180 'трав':121 'увидет':168 'уш':21 'хвост':24 'хищн':107 'хлебн':122 'хорош':97 'ч':41 'част':166 'человек':106 'шерст':65 'ямк':60


Делаю запрос к базе, который бы хотел использовать, но он не отдает результат:
SELECT "blogs".* FROM "blogs" WHERE search_index::tsvector @@ to_tsquery('Зайцы')


Вот такой запрос отдает нужный результат, но использует вычисления на лету:
SELECT "blogs".* FROM "blogs" WHERE to_tsvector(description) @@ to_tsquery('Зайцы')


Как задействовать столбец search_index в запросах?
  • Вопрос задан
  • 457 просмотров
Подписаться 7 Простой 1 комментарий
Решения вопроса 1
@SZolotov
Asp.net core, MAUI,WPF,Qt, Avalonia
Попробуйте так

select * from blog where websearch_to_tsquery('russian', 'зайцы') @@ search_vector
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы