Full Text Search امکان index کردن و جستجوی دیتای متنی را بر مبنای لغات کلیدی در SQL Server  فراهم می کند . بر خلاف LIKE که محدوده عمل آن روی کاراکترهاست ، Full Text Search بر روی کلمات بر مبنای زبان ِ متن ، پرس و جو انجام می دهد . اختلاف سرعت Full Text Search و LIKE در زمانی که می خواهیم یک Query را بر روی چند میلیون رکورد اجرا کنیم بسیار مشهود است . اگر با LIKE دنبال یک ترکیب بگردیم ، تهیه گزارش ممکن است چندین دقیقه طول بکشد در حالی که استفاده از Full Text Search آن را به چند ثانیه کاهش می دهد .


بعضی از اصطلاحاتی که در Full Text Search استفاده می شود عبارتند از :


Full Text Index : برای ذخیره سازی کلمات و محل آنها در یک ستون بکار می رود .


Full Text Catalog : حاوی هیچ یا یک Full Text Index است . کاتالوگ ها روی هارد دیسک قرار می گیرند و با SQL  Server در ارتباط هستند . هر کاتالوگ می تواند نیازهای اندیس های یک یا چند جدول را در یک دیتابیس تامین کند . در مواردی که حجم اطلاعات زیاد می شود ( چند صد گیگابایت در هر جدول) انتخاب نحوه ذخیره کاتالوگ و محل آن مهم است و می بایست با دقت انجام شود . مثلا ً کاتالوک در همان هارد دیسکی باشد که جدول در آن ذخیره شده یا کاتالوگ و جدول در چند سرور پخش شود . در MSDN نمونه های تحقیقاتی برای بانکهای اطلاعاتی با حجم بالا آمده است .


Word Breaker : برای یک زبان خاص ، متنها را بر اساس دستورات لغوی زبان تکه تکه می کند .


Token : کلمه یا رشته ای که توسط Word Breaker شناخته شده است .


Stemmer : برای یک زبان خاص ، با توجه به قواعد زبان ، هم خانواده ها یا صرف فعلهای یک لغت را تولید می کند . مثل write و wrote یا foot و feet .


Filter : با توجه به نوع فایل (مثلاً doc) ، فلیترها متن را از فایلهای ذخیره شده در varbinary استخراج می کنند . انواع فایلهای MS Office جزو نوع هایی است که فیلترها امکان استخراج متن از آن را دارند . شرکتهای دیگر نیز فیلترهایی برای نرم افزارهای خودشان ساخته اند مثل PDF 


Population یا crawl : عملیات ایجاد و نگهداری Full Text Index است .


Noise Words : لغاتی که کمکی در جستجوها نکرده و بی دلیل حجم اندیس را زیاد می کنند و می بایست نادیده گرفته شوند مانند a ، is و and .


Full Text Index بر روی ستونهایی از نوع char ، varchar ، nvarchar همچنین برای اطلاعات باینری مثل فایل Word ، varbainary یا image قابل پیاده سازی است . از LIKE بر روی ستونهای باینری نمی توان استفاده کرد .


Full Text Index اندیسی token based است که بوسیله Microsoft Full Text Engine for SQL یا MSFTESQL ایجاد و نگهداری می شود . عملیات ساخت Full Text Index با دیگر انواع اندیس ها متفاوت است . به جای ایجاد یک ساختار B-Tree  بر مبنای محتوای سطرها ، MSFTESQL بر مبنای token های جدا شده از متن جدولی جداگانه تشکیل می دهد .


جدولی که بر روی آن می خواهیم اندیس از نوع Full Text ایجاد کنیم حتماً می بایست یک فیلد با مقدار یکتا و Not Null داشته باشد . در Full Text Index مقادیر در جدول دیگری ( که در SQL 2008 می توان مقادیر آن جدول را هم دید ) به همراه این فیلد یکتا نگهداری می شود تا هنگامی که لغات کلیدی را در جدول اندیس پیدا کرد بتواند آن را به جدول اصلی پیوند دهد .


Full Text Index با سه روش قابل ایجاد است :


یک – Full Population
تمامی سطرهای جدول بازبینی ، اطلاعات آن استخراج و در محل مناسب خود ذخیره می شود . مانند بار اولی است که اندیس جدول تهیه می شود .


دو – Change tracking based population
فقط سطرهایی که تغییر پیدا کرده اند برای بازسازی اندیس استفاده می شوند . این تغییر در اندیس می تواند به شکل خودکار یا دستی انجام شود . برای اینکار در دستور مربوط به ایجاد اندیس از With Change_tracking  با پارامتر AUTO یا MANUAL استفاده می شود .


سه – Incremental Timestamp based population
اگر از ستونی با نوع timestamp استفاده شده باشد تغییر در اندیس فقط بر روی سطرهایی خواهد بود که پس از یا در زمان populationقبلی تغییر پیدا کرده اند . زمان آخرین تغییر به شکل timestamp ذخیره می شود.


برای ساخت یک Full Text Index ابتدا می بایست یک کاتالوگ برای دیتابیس ساخت :


CREATE FULLTEXT CATALOG HamedFTS


برای اینکه بدانیم قبلا ً چه کاتالوگ هایی در دیتابیس ایجاد شده اند از کد زیر می توان استفاده کرد .


select fulltext_catalog_id , name from sys.fulltext_catalogs

 

جدولی به نام Articles با سه ستون ، ID ، Title و Contents داریم که ID کلید اصلی است . نام اندیس که روی ID وجود دارد pk_articles_id است . Title از نوع nvarchar(100) و Contents از نوع nvarchar(max)می باشد .


CREATE FULLTEXT INDEX ON Articles
(Contents)
KEY INDEX pk_articles_id
ON HamedFTS
WITH CHANGE_TRACKING AUTO


برای ستون Contents از جدول Articles یک Full Text Index ایجاد می شود . این اندیس در کاتالوگی به نام HamedFTS قرار می گیرد و با تغییر پیدا کردن سطرهای جدول اندیس به روز می شود .


اگر به شاخه FTData در MSSQL در شاخه ای که SQL Server نصب شده است بروید شاخه ای با نام Catalog ی که ایجاد کرده ایم مشاهده خواهید کرد . در  FTData فایلهایی وجود دارد که در آنها Noise Words و لغات مشابه را می توان تعریف کرد .


برای پرس و جو از این نوع اندیس چند عملگر وجود دارند . Contains ، ContrainsTable ، FreeText و FreeTextTable . که نوع Table دار ، به جای یک مقدار ، یک جدول را بر می گرداند .


Contains : شرطی که برایش نوشته شده است را اجرا می کند .


FreeText : در هر جا لغت مورد نظر را پیدا کند در خروجی می آورد .


SELECT Title , Contents FROM Articles WHERE FREETEXT(Contents , 'Word1 Word2')


هر رکوردی که Word1 یا Word2 یا ترکیبی از اینها با کلمه دیگر داشته باشد در خروجی می آید .


SELECT Title , Contents FROM Articles WHERE CONTAINS(Contents , 'Word1')


فقط سطرهایی که Word1 در فیلد Contents آنها وجود دارد در خروجی می آید .


SELECT Title , Contents FROM Articles WHERE CONTAINS(Contents , '   "Word1 Word2"  ')


سطرهایی که عبارت Word1 Word2 دارند در پاسخ آورده می شوند .


SELECT Title , Contents FROM Articles WHERE CONTAINS(Contents , 'Word1 AND Word2')


سطرهایی که هم Word1 و هم Word2  دارند ، بدون توجه به مکان آنها ، در خروجی می آید .


SELECT Title , Contents FROM Articles WHERE CONTAINS(Contents , '  "Word1*" ')


سطرهایی که ترکیبات مشابه Word1 را دارند در خروجی می آید .


SELECT Title , Contents FROM Articles WHERE CONTAINS(Contents , 'FORMSOF(INFLECTIONAL,"foot")')


سطرهایی که کلمه هایی مشابه foot دارند ، مثل feet ، در خروجی می آید .


CONTAINS مانند خود دستور SELECT حالتهای مختلفی دارد که می توانید کامل آن را در MSDN مشاهده کنید . 


نمونه استفاده از CONTAINSTABLE مانند زیر است :


SELECT *
FROM Articles INNER JOIN CONTAINSTABLE
( Articles , Contents , 'Word1') AS KEY_TBL
ON Articles.ID = KEY_TBL.[key]

 

برای استفاده از FULL Text Search می بایست سرویس مربوطه در ویندوز فعال باشد (SQL Server Full Text Service) . ممکن است هنگام راه اندازی این سرویس با خطایی مربوط به سرویسهای وابسته برخورد کنید . برای رفع آن به این شاخه در رجیستری بروید HKEY_LOCAL_MACHINE\System\CurrentControlSet\Serviecs\MSFTESQL در DependOnService مقدار NTLMSSP را حذف کرده و سیستم را دوباره راه اندازی کنید .


Full Text Search در SQL 2008 کمی تغییرات دارد اما کلیات همین است .


در این متن سعی شد خلاصه ای از Full Text Search ارائه شود . اطلاعات دقیق تر مثل ساختار جدولی که اطلاعات اندیس در آن قرار دارد و دیگر نکات در MSDN قرار دارد .


Photo from technet


 

GravatarافشارWwW
سه شنبه ساعت 08:33 , 17/10/1387
جالب بود
Gravatarمحمود مروج
سه شنبه ساعت 16:32 , 17/10/1387
خیلی ممنون.باز هم منتظر مطالب حرفه ای خوب و کوتاهت هستم.
Gravatarمیلاد
پنج شنبه ساعت 11:06 , 19/10/1387
ممنون ازت بازم از این کارا بکن ;)
Gravatarمیثم
پنج شنبه ساعت 16:26 , 12/6/1388
عالی و بی نقص، چکیده ای به این مفیدی ، قلم روان و احاطه به مطلب رو نشون میده.
Gravatarطاهره
سه شنبه ساعت 12:32 , 17/6/1388
آيا اين امكان وجود داره پاراگرافي شامل يك كلمه خاص رو جستجو كنيم؟
Gravatarبوف کور
شنبه ساعت 22:17 , 21/6/1388
خوب بود اگه میشه درباره ssis مطلب بزار MER30
GravatarKaveh Jamali
سه شنبه ساعت 09:27 , 15/4/1389
moshkel ye to 2008 chizi ast ke shadidan rooshmoshkel daram mitoonid be man komak konid?
Gravatarمرتضی
سه شنبه ساعت 06:49 , 16/9/1389
بسیار عالی بود دستت درد نکنه
Gravatarامیرحسین
دوشنبه ساعت 21:15 , 1/3/1391
دستت درد نکنهاگه ممکنه در مورد بحث transaction isolation level هم مطلب بذارینممنون
نام :   
ايميل :      اين سايت از سيستم گراواتر استفاده می کند ، اگر در گراواتر دارای کد کاربری هستيد می توانيد از آن آدرس ايميل استفاده کنيد.  
وب سايت :   
ديدگاه :   
عدد زير را وارد کنيد :
  


  پيام شما بعد از بازبينی افزوده خواهد شد.