နားလည်ထားရမယ့် အချက်
`ILIKE '%word%'` က simple substring search ဖြစ်ပြီး linguistic normalization၊ ranking နဲ့ scalable index အတွက်မလုံလောက်နိုင်ပါ။ PostgreSQL full-text search က document ကို lexemes ပါသော `tsvector` အဖြစ်ပြောင်းပြီး user query ကို `tsquery` အဖြစ်သတ်မှတ်ပါတယ်။ Language configuration က stemming/stop words ကိုသက်ရောက်ပါတယ်။
လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
English title/description အတွက် generated search vector column ထည့်ပြီး GIN index လုပ်မယ်။ Burmese word segmentation/stemming ကို built-in `english` config မဖြေရှင်းနိုင်တာကြောင့် locale အလိုက် simple config၊ trigram extension သို့ external search ကို test data ဖြင့်ရွေးရပါတယ်။
အတူတူ စမ်းရေးကြည့်မယ်
ALTER TABLE app.tutorials
ADD COLUMN search_vector tsvector
GENERATED ALWAYS AS (
to_tsvector('english', coalesce(title, '') || ' ' || coalesce(metadata->>'summary', ''))
) STORED;
CREATE INDEX tutorials_search_gin_idx
ON app.tutorials USING gin (search_vector);
SELECT title, ts_rank(search_vector, q) AS rank
FROM app.tutorials, websearch_to_tsquery('english', 'postgres performance') AS q
WHERE search_vector @@ q
ORDER BY rank DESC;Rank ပါသော indexed full-text search result ရမည်။၅ မိနစ် စမ်းကြည့်
Title ကို description ထက် weight ပိုပေးရန် `setweight` နဲ့ vector နှစ်ခု combine လုပ်ပါ။
သတိလေးတစ်ချက်
English config ကို Burmese content ပေါ်တန်းသုံးပြီး search quality ကောင်းမယ်ဟု မယူဆပါနှင့်။ Locale တစ်ခုစီကို evaluation set ဖြင့်စမ်းပါ။
PostgreSQL — Full Text Search — PostgreSQL Global Development Group