Postgresql
@code_craftersمبحث TSVECTOR و TSQUERY را در Postgres برای جستجوی متن کامل (Full-Text Search) درک کنید.
مقدمه : جستجوی متن کامل یک تکنیک است که برای یافتن اسنادی که حاوی کلماتی هستند که شما به دنبال آنها هستید استفاده می شود. این کار با تجزیه اسناد و پیوند کلمات به سند اصلی انجام می شود. سپس این پیوندها برای یافتن اسنادی که حاوی کلمات پرس و جو هستند استفاده می شوند.
جستجوی متن کامل در موتورهای جستجو مانند Google و Firefox استفاده می شود. همچنین می توان از آن در پایگاه های داده برای یافتن رکوردهایی که حاوی کلمات خاصی هستند استفاده کرد.
مشکلات معمول هنگام استفاده از عملگر LIKE در SQL :
۱.جستجوی دقیق: LIKE عملگر فقط برای کلمات دقیق جستجو می کند و نمی تواند برای جستجوی انواع مختلف کلمات استفاده شود. به عنوان مثال، اگر شما برای کلمه "تولید" در یک سند جستجو کنید، اما برخی از رکوردها فقط حاوی کلمه "تولید کننده" هستند، این پرس و جو آن رکوردها را باز نمی گرداند.
۲.رتبه بندی: LIKE عملگر رتبه ای برای اسنادی که با اصطلاح جستجو مطابقت دارند باز نمی گرداند. به عنوان مثال، اگر یک اصطلاح جستجو در چندین سند بیش از یک بار ظاهر شود، سندی که بیشترین تکرار اصطلاح جستجو را دارد، مهمتر از سندی است که کمترین تکرار را دارد. LIKE عملگر رتبه بندی نسبی را بین چندین سند ارائه نمی دهد.
۳.عملکرد کند: LIKE عملگر در اسناد بزرگ بسیار کند عمل می کند و منجر به عملکرد ضعیف می شود.
این مشکلات در مورد عملگر "ilike" نیز وجود دارد. تنها تفاوت این است که "ilike" حساس به حروف کوچک نیست.
به طور خلاصه، LIKE عملگر یک ابزار مفید برای جستجوی کلمات دقیق در یک سند است، اما برای جستجوی انواع مختلف کلمات یا برای رتبه بندی اسنادی که با اصطلاح جستجو مطابقت دارند، مناسب نیست.
جستجوی متن کامل در tsvector tsquery : PostgreSQL
در پایگاه داده PostgreSQL دو نوع داده، tsvector و tsquery، برای کمک به جستجوی متن کامل ارائه می دهد، زیرا عملگرهای "like" و "ilike" در توانایی خود در انجام تجزیه و تحلیل جستجوی متن کامل محدود هستند. TS در tsvector و tsquery به معنای جستجوی متن است. نوع tsvector برای نشان دادن یک سند قابل جستجوی متن استفاده می شود، در حالی که نوع tsquery برای نشان دادن پرس و جوهای متنی در فرمت پرس و جو متن استفاده می شود. در Postgresql، هر دو برای انجام جستجوی متن کامل استفاده می شوند. یک tsvector یک مجموعه مرتب از کلمات منفرد است که کلماتی هستند که شامل چندین نوع مختلف از یک کلمه هستند.
به زبان ساده، tsvector یک نوع داده است که برای ذخیره سازی سند قابل جستجوی متن استفاده می شود و tsquery یک نوع داده است که برای ذخیره سازی پرس و جوهای متنی استفاده می شود. توابع to_tsvector() و to_tsquery() به ترتیب این دو نوع داده را ایجاد می کنند.

در Postgres یک جدول با نحو بالا ایجاد می شود و 4 رکورد به آن اضافه می شود.
نحوه استفاده از to_tsvector() ؟
تابع to_tsvector() یک tsvector را از یک متن یا سند ایجاد میکند. tsvector یک مجموعه مرتب از جفتهای کلید-مقدار است که کلید آن یک لکسیم و مقدار آن موقعیت لکسیم است. لکسیمها نمایشهای نرمالشده کلمات هستند. stop word کلماتی هستند که برای جستجوهای متنی مهم نیستند. این کلمات معمولاً کلماتی هستند که بسیار رایج هستند، مانند "the"، "is" و "and". stop word در tsvector گنجانده نمیشود. لکسیمها در tsvector به ترتیب الفبا مرتب میشوند.

در این مثال، کلمه "confidence " به "confid" تبدیل می شود و در موقعیت 10 قرار می گیرد. کلمه "market" دو بار ظاهر می شود، یک بار در موقعیت 5 و یک بار در موقعیت 15.

تفاوت بین تبدیل نوع tsquery و توابع to_tsquery ()
همانطور که در عبارت بالا نشان داده شده است ، تبدیل نوع به نوع داده tsquery در Postgres نتایج دقیقی تولید نمی کند. وقتی از عملگر cast (::) روی کلمه confidence استفاده می کنیم ، کلمه "confidence" را برمی گردانیم. در مقابل ، to_tsquery () نمایش نرمال شده confidence ، "confid" را برمی گرداند. اگر توابع PostgreSQL در دسترس هستند ، باید همیشه از آنها برای تبدیل به جای عملگر cast استفاده کنید. عملکرد ضعیف query نیز توسط عملگر cast ایجاد می شود.
به زبان ساده ، عملگر cast (::) کلمه را به نوع داده tsquery تبدیل می کند ، اما این لزوماً نمایش نرمال شده کلمه نیست. توابع to_tsquery () ، از سوی دیگر ، نمایش نرمال شده کلمه را برمی گردانند ، که بیشتر احتمال دارد در ts vector موجود باشد. همچنین ، عملگر cast می تواند باعث عملکرد ضعیف query شود.
بهینه سازی برای جستجوی سریع متن:
برای بهبود عملکرد جستجوی متنی در Postgres، میتوانید یک index بر روی فیلد tsvector ایجاد کنید. این index به Postgres کمک میکند تا سریعتر query های جستجوی متنی را اجرا کند. شما میتوانید از دو approach برای ایجاد این index استفاده کنید:
ایجاد مستقیم فیلد to_tsvector() در یک index.
ایجاد یک tsvector ستون دیگر در جدول خود با استفاده از to_tsvector() و سپس ایجاد یک index gin بر روی این فیلد.
بهترین approach برای شما به ساختار داده شما و نوع جستجوی متنی که انجام میدهید بستگی دارد.

چگونه از ()to_tsquery استفاده کنیم؟
تابع to_tsquery() یک tsquery را برای الگوی جستجو شده در متن (یا سند) برمی گرداند. یک tsquery یک نوع داده خاص است که یک پرس و جو جستجوگر متن را نشان می دهد. نمایش لکسیم نرمال شده هر کلمه کمی با خود کلمه متفاوت است. به عنوان مثال، نمایش لکسیم نرمال شده کلمه "confidence" "confid" است.
اگر کلمه "confidence" را بدون استفاده از تابع to_tsquery() جستجو کنید، PostgreSQL نتیجه ای برنمی گرداند. این به این دلیل است که PostgreSQL به صورت داخلی کلمه "confidence" را به نوع داده tsquery تبدیل می کند، که کلمه "confidence" را به خودی خود برمی گرداند. با این حال، نمایش لکسیم نرمال شده کلمه "confidence" "confid" است، که در ts vector وجود ندارد.
برای جلوگیری از این امر، باید قبل از جستجو، از تابع to_tsquery() برای تبدیل الگوی جستجو به یک tsquery استفاده کنید. این تضمین می کند که PostgreSQL برای نمایش لکسیم نرمال شده کلمه جستجو می کند، که بیشتر احتمال دارد در ts vector موجود باشد.
به زبان ساده، تابع to_tsquery() به PostgreSQL کمک می کند تا کلماتی را که شما جستجو می کنید، حتی اگر آنها به صورت متفاوتی املا شده باشند یا capitalization متفاوتی داشته باشند، پیدا کند.
@code_crafters