TIN؛ جستوجوی متن سریع برای Postgres
خلاصهٔ کاملتر
پلنتاسکیل اکستنشن تازهاش برای Postgres رو با اسم TIN معرفی کرده، یه ایندکس full-text search (یعنی جستوجو داخل متن آزاد، نه تطبیق دقیق مقدار یه ستون). به گفتهٔ نویسندهها، این همون چیزیه که مشتریهاشون بیشتر از هر امکان دیگهای میخواستن. نسخهاش همین حالا GA شده و روی دیتابیسهای Postgres و Neki در دسترسه. ساختن ایندکس یه دستور سادهست و کوئری هم با عملگر ==> زده میشه:
CREATE INDEX an_index_name ON table_name USING tin(text_column_name);
SELECT * FROM table_name
WHERE text_column_name ==> 'some words';TIN عبارتهای بولی، phrase query، جستوجوی fuzzy و wildcard و regex، و هم COUNT(*) و هم top-k با امتیازدهی BM25 رو پشتیبانی میکنه. تو مقاله اومده که برای Postgres از قبل دستکم سه ایندکس متنی دیگه هست، ولی هیچکدوم همهٔ اینها رو یکجا ندارن.
بنچمارکها روی یه کورپوس ۸۵ گیگابایتی از Stack Exchange با ۱۵۰ میلیون سند و یه ماشین i7i.8xlarge آمازون با ۸ vCPU و ۳۲ گیگ رم اجرا شده. تو کوئریهای ترکیبی top-10، TIN حدود ۲۵ برابر ParadeDB کوئری جواب میده و تأخیر p99 هم ۲۶ برابر کمتره. ساخت ایندکس هم ۸ دقیقه طول کشیده، در برابر ۱۹ دقیقهٔ ParadeDB و بیشتر از دو ساعت GIN.
رمز سرعتش اینه که بهجای شمارهگذاری ترتیبی سندها، مستقیم از ctid خود Postgres (همون شناسهٔ ۴۸ بیتی که جای فیزیکی سطر رو تو heap نشون میده) بهعنوان شناسهٔ سند استفاده میکنه. یعنی اون جدول نگاشت اضافهای که ParadeDB و pg_textsearch مجبورن نگه دارن کلاً حذف میشه و برای ۱۰ میلیون سطر هم هیچ لوکاپ اضافهای لازم نیست.
فشردهسازی هم دوسطحیه: یه بیتمپ ۲۵۶ بیتی برای شماره صفحهها که دقیقاً اندازهٔ یه رجیستر AVX2 ـه، و بیتمپهای ریز برای offset داخل هر صفحه. با همین، AND و OR کردن پستینگلیستها میشه چند دستور برداری روی CPU و شمردن نتیجهها با POPCNT انجام میشه. نویسندهها میگن واژههای پرتکرار به حدود ۱ بیت به ازای هر posting میرسن.
سراغ MVCC هم رفتن: برای کوئریهای شمارشی، TIN بیتمپ صفحههاش رو مستقیم با visibility map خود Postgres تقاطع میگیره و اگه همهٔ صفحهها all-visible باشن اصلاً به heap دست نمیزنه. حذفها هم با یه liveness bitmap در هر segment مدیریت میشه که موقع VACUUM بیت سطرهای حذفشده توش صفر میشه. یعنی ایندکس زیر بار نوشتن مداوم هم درست و سریع میمونه.
نکات کلیدی:
- TIN نسخهٔ GA شده و روی همهٔ دیتابیسهای Postgres و Neki پلنتاسکیل فعاله
- تو کوئری ترکیبی top-10 روی ۸۵ گیگ داده: ۱۹۹ QPS برای TIN در برابر ۷.۹ QPS برای ParadeDB
- ساخت ایندکس ۸ دقیقه و ۵۰.۷ گیگابایت، در برابر ۲ ساعت و ۹ دقیقهٔ Postgres GIN
- بهجای شناسهٔ ترتیبی، مستقیم ctid پستگرس بهعنوان شناسهٔ سند استفاده میشه
- بیتمپ صفحه ۲۵۶ بیتیه تا توی رجیسترهای AVX2 و AVX-512 جا بشه
- امتیازدهی با BM25 انجام میشه و COUNT(*) هم پشتیبانی میشه




