قبلش پست های دیگه منو در مورد full text search و ایندکس گذاری در PostgreSQL بخونید.
قبل از همه از اینجا دیتاست محصولاتش (که اسم فایلش 5-awte8wbd هست) رو دانلود کنید. مرحله بعد ایجاد یه دیتابیس PostgreSQL ای توی داکر هست. حالا بیاید دیتابیس رو ایجاد بکنید و بعدش کوئری زیر رو اجرا کنید:
create table products ( id bigint primary key, product_title_fa varchar(255), product_title_en varchar(255), url_code varchar(255), title_alt varchar(255), category_title_fa varchar(255), category_keywords varchar(255), brand_name_fa varchar(255), brand_name_en varchar(255), product_attributes varchar(5500) );
بعدش با دستور docker cp فایل رو توی کانتینر بزارید و بعدش کوئری زیر رو اجرا کنید:
COPY products FROM '/tmp/5-awte8wbd.csv' WITH CSV HEADER;
مرحله بعد افزودن ستون جدید هست:
alter table products add column __search tsvector;
حالا میایم اون ستون رو مقدار دهی می کنیم:
update products p set __search = to_tsvector(p.product_title_fa);
بعدش ستون جدید رو ایندکس گذاری با متد GIN ایندکس گذاری می کنیم.
create index idx_products__search on products using GIN(__search);
حالا بیاید این دو تا کوئری رو با هم مقایسه بکنیم:
explain analyse select count (*) from products where __search @@ to_tsquery('سرمه');
نتیجه اینه:
کوئری دوم اینه:
explain analyse select count (*) from products where product_title_fa like '%سرمه%';
نتیجه اینه:
یه چیزی در حدود ۵۰ برابر سریعتر شد اجرای کوئری!