آموزش Full-Text Search

آموزش Full-Text Search

بسم الله الرحمن الرحیم

آموزش ساخت Full Text Catalog و Full Text Search در SQL Server

در این آموزش مفاهیم زیر را بررسی خواهیم کرد

  • ساخت Full-Text Search

    • ساخت Full-Text Catalog

    • ساخت Full-Text Index

  • نوشتن Query با استفاده از Full-Text Search

  •  استفاده از Full-Text Search  در پروژه های ASP.NET MVC  به کمک LINQ

تصور کنید وب سایتی دارید و میخواهید بر روی حجم زیادی از اطلاعات جستجو انجام دهید. وب سایت شما یک وب سایت آموزشی مانند ABLY.ir است و در آن متن های زیادی وجود دارد. شما میخواهید یک فرم جستجو برای جستجو در تمامی قسمت های وب سایت ایجاد کنید.
چطور می توانید این جستجو را با این ویژگی ها پیاده سازی کنید؟
1- جستجو در کلمات کلیدی
2- جستجو در میان نویسندگان
3- جستجو در مطالب
4- جستجو در عنوان فایل ها
و..

اولین راه حلی که انتخاب می شود JOIN کردن تمام جداول و نوشتن یک دستور SELECT با انجام WHERE بر روی همه ی ستون ها است!.  این راه حل بدترین راه حل ممکن است زیرا در صورتی که حجم اطلاعات شما افزایش یابد عملا سیستم جستجو شما دیگر پاسخگو نخواهد بود زیرا طبیعتا برای جستجو در متن ها باید از دستور LIKE استفاده کنید که این دستور خود به دلیل مقایسه تمامی عبارت های ذخیره شده به صورت بخش به بخش با متن درخواستی کاربر بسیار سرعت کمی دارد، همچنین هزینه JOIN بسیار سنگین خواهد بود و باعث می شود عملا این ویژگی غیر قابل استفاده شود.
SQL Server با ارائه دادن ابزاری به نام Full Text Search به شما این امکان را می دهد که به سادگی و با بهترین کارایی جستجحو های خود را بر روی متن ها انجام دهید.

Full Text Search

Full Text Search ابزاری است که به شما برای ایجاد انواع کوئری های پیچده بر روی داده های از نوع کاراکتر (Character) کمک می کند. این کوئری ها می توانند بر روی کلمات، جمله ها و عبارت ها مورد استفاده قرار گیرند. ما می توانیم یک full-text index را بر روی یک Table و یا یک indexed view ایجاد کنیم. full-text Search تنها می تواند بر روی یک Table و یا یک indexed view مورد استفاده قرار گیرد. Index می تواند تا 1024 ستون (Column) را در بر گیرد.

Full Text Index

Full Text Index از Token هایی تشکیل می شود که این Token ها در واقع همان کلمات درون یک فیلد شما هستند و این امر باعث می شود که بتوان بر روی متون index گذاری کرد و سرعت جستجو را افزایش داد.
مثال: من اسماعیل شیدایی هستم.
اگر مقدار یکی از رکوردهای ما به صورت بالا باشد پس از انجام عملیات full-text index این متن به صورت زیر ذخیره خواهد شد.
"من"
"اسماعیل"
"شیدایی"
"هستم"
این کار باعث می شود تا شما در سریعترین حالت ممکن بتوانید به اطلاعات مورد نظر خود برسید زیرا SQL Server اطلاعات شما را Index گذاری می کند در نتیجه به سرعت می تواند محل قرار گیری (شماره رکورد) هر کلمه را در جدول بازیابی کند.

طبیعتا راه حل پیش فرض برای جستجو در متن ها استفاده از دستور LIKE می باشد.  دستور Like بر روی کاراکترها جستج خود را انجام می دهد و مقدار درخواستی شما را با تمام متن ها مقایسه می کند اما در Full Text Search مقدار درخواستی شما با کلمات مقایسه می شود به همین دلیل تفاوت سرعت اجرای این دو دستور در کوئری های پیچیده بسیار مشخص خواهد بود.

برای ساخت Index می بایست ما مراحل زیر را انجام دهیم.


1.    Create a Full-Text Catalog

2.    Create a Full-Text Index

3.    Populate the Index


Create a Full-Text Catalog

ابتدا دیتابیس خود را انتخاب کرده، سپس از بخش Storage بر روی Full Text Catalog راست کلیک کرده و گزینه New Full-Text-Catalog را انتخاب می کنیم.

آموزش Full Text Search

در پنجره باز شده نامی را برای Full Text Catalog خود انتخاب می کنیم و سپس Ok را انتخاب کنید. Full Text Catalog ما با موفقیت ایجاد شد.

بسم الله الرحمن الرحیم

آموزش ساخت Full Text Catalog و Full Text Search در SQL Server

در این آموزش مفاهیم زیر را بررسی خواهیم کرد

  • ساخت Full-Text Search

    • ساخت Full-Text Catalog

    • ساخت Full-Text Index

  • نوشتن Query با استفاده از Full-Text Search

  •  استفاده از Full-Text Search  در پروژه های ASP.NET MVC  به کمک LINQ

تصور کنید وب سایتی دارید و میخواهید بر روی حجم زیادی از اطلاعات جستجو انجام دهید. وب سایت شما یک وب سایت آموزشی مانند ABLY.ir است و در آن متن های زیادی وجود دارد. شما میخواهید یک فرم جستجو برای جستجو در تمامی قسمت های وب سایت ایجاد کنید.
چطور می توانید این جستجو را با این ویژگی ها پیاده سازی کنید؟
1- جستجو در کلمات کلیدی
2- جستجو در میان نویسندگان
3- جستجو در مطالب
4- جستجو در عنوان فایل ها
و..

اولین راه حلی که انتخاب می شود JOIN کردن تمام جداول و نوشتن یک دستور SELECT با انجام WHERE بر روی همه ی ستون ها است!.  این راه حل بدترین راه حل ممکن است زیرا در صورتی که حجم اطلاعات شما افزایش یابد عملا سیستم جستجو شما دیگر پاسخگو نخواهد بود زیرا طبیعتا برای جستجو در متن ها باید از دستور LIKE استفاده کنید که این دستور خود به دلیل مقایسه تمامی عبارت های ذخیره شده به صورت بخش به بخش با متن درخواستی کاربر بسیار سرعت کمی دارد، همچنین هزینه JOIN بسیار سنگین خواهد بود و باعث می شود عملا این ویژگی غیر قابل استفاده شود.
SQL Server با ارائه دادن ابزاری به نام Full Text Search به شما این امکان را می دهد که به سادگی و با بهترین کارایی جستجحو های خود را بر روی متن ها انجام دهید.

Full Text Search

Full Text Search ابزاری است که به شما برای ایجاد انواع کوئری های پیچده بر روی داده های از نوع کاراکتر (Character) کمک می کند. این کوئری ها می توانند بر روی کلمات، جمله ها و عبارت ها مورد استفاده قرار گیرند. ما می توانیم یک full-text index را بر روی یک Table و یا یک indexed view ایجاد کنیم. full-text Search تنها می تواند بر روی یک Table و یا یک indexed view مورد استفاده قرار گیرد. Index می تواند تا 1024 ستون (Column) را در بر گیرد.

Full Text Index

Full Text Index از Token هایی تشکیل می شود که این Token ها در واقع همان کلمات درون یک فیلد شما هستند و این امر باعث می شود که بتوان بر روی متون index گذاری کرد و سرعت جستجو را افزایش داد.
مثال: من اسماعیل شیدایی هستم.
اگر مقدار یکی از رکوردهای ما به صورت بالا باشد پس از انجام عملیات full-text index این متن به صورت زیر ذخیره خواهد شد.
"من"
"اسماعیل"
"شیدایی"
"هستم"
این کار باعث می شود تا شما در سریعترین حالت ممکن بتوانید به اطلاعات مورد نظر خود برسید زیرا SQL Server اطلاعات شما را Index گذاری می کند در نتیجه به سرعت می تواند محل قرار گیری (شماره رکورد) هر کلمه را در جدول بازیابی کند.

طبیعتا راه حل پیش فرض برای جستجو در متن ها استفاده از دستور LIKE می باشد.  دستور Like بر روی کاراکترها جستج خود را انجام می دهد و مقدار درخواستی شما را با تمام متن ها مقایسه می کند اما در Full Text Search مقدار درخواستی شما با کلمات مقایسه می شود به همین دلیل تفاوت سرعت اجرای این دو دستور در کوئری های پیچیده بسیار مشخص خواهد بود.

برای ساخت Index می بایست ما مراحل زیر را انجام دهیم.


1.    Create a Full-Text Catalog

2.    Create a Full-Text Index

3.    Populate the Index


Create a Full-Text Catalog

ابتدا دیتابیس خود را انتخاب کرده، سپس از بخش Storage بر روی Full Text Catalog راست کلیک کرده و گزینه New Full-Text-Catalog را انتخاب می کنیم.

آموزش Full Text Search

در پنجره باز شده نامی را برای Full Text Catalog خود انتخاب می کنیم و سپس Ok را انتخاب کنید. Full Text Catalog ما با موفقیت ایجاد شد.

آموزش Full Text Catalog


Create a Full-Text Index

حال بر روی جدولی که قصد دارید اطلاعات درون آن را جستجو کنید کلیک راست کرده و از گزینه Full-Text Index زیر منو Define Full-Text Index را انتخاب کنید.

آموزش Full Text Index


گزینه Next را انتخاب کنید.

آموزش Full Text Index


در این مرحله فیلدی از جدول که Index گذاری شده است را باید انتخاب کنید. همانطور که می دانید کلید های اصلی هر جدول Index نیز هستند، در این جا کلید اصلی جدول که تنها فیلد Index گذاری شده است را انتخاب می کنیم.

آموزش Full Text Search


در این مرحله فیلدهایی که قصد جستجو کردن اطلاعات بر روی آنها را دارید را انتخاب کنید.
انتخاب زبان باعث می شود تا فرایند جستجو تسریع شود.

Statistics semantics

گزینه Statistics semantics برای جستجو کردن عبارت هایی است که هم معنا و هم واژه عبارت کاربر هستندو مثلا کاربر SQL را در سایت ABLY.ir جستجو می کند. در صورتی که بخواهید کاربر به اطلاعات بهتری دست پیدا کند شما باید علاوه بر کلمه SQL کلمات دیگری همچون SQL Server, MSSQL را برای او جستجو کنید. گوگل نیز دقیقا از همین روش برای بهتر شدن نتایج جستجو استفاده می کند. برای انجام اینکار می توانید از Statistics semantics که تا 100 کلمه را پیشتیبانی می کند استفاده کنید.
برای استفاده از این ویژگی می بایست ابتدا آن را بر روی SQL Server خود نصب و تنظیم نمایید. در مورد این ویژگی در این مقاله صحبت نخواهیم کرد.

فیلد های مورد نظر خود را انتخاب کنید و سپس گزینه Next را انتخاب کنید.

آموزش Full Text Search


 در این مرحله شما می توانید نحوه انجام تغییرات را برای  Indexگذاری مشخص کنید. بهترین گزینه برای Changing Track گزینه Automatic است، ما در اینجا نیز این گزینه را انتخاب می کنیم و به مرحله بعد می رویم.

آموزش Full Text Catalog

Catalog ایی را که در مرحله ابتدایی ساختید می توانید همین جا انتخاب کنید و یا Catalog جدیدی را ایجاد کنید. همچنین محل ذخیره سازی Index را می توانید با استفاده از Create Partition در یک فایل جدا قرار دهید. برای اینکار کافی است محل ذخیره سازی را توسط گزینه Select Index filegroup مشخص کنید.

Stopwords and Stoplists

Stoplist ویژگی است که در نسخه های SQL Server 2008 و بعد از آن با عنوان Stopwords and Stoplists مورد استفاده قرار می گیرد، این ویژگی در واقع به منظور حذف کلماتی است که در جستجو شما تاثیری ندارند مانند and, is, to, the و..
همانطور که می دانید Google نیز در جستجوها کلمات ربطی را حذف می کند شما نیز می توانید این کار را برای جتسجو های خود انجام دهید.
 بر روی گزینه Next کلیک کنید.

آموزش Full Text Search


در این مرحله می توانید زمانبندی انتشار Catalog خود را انتخاب کنید. بر روی Next کلیک کنید.

آموزش Full Text Search

بر روی گزینه Finish کلیک کنید تا فرایند ایجاد Index به اتمام برسد.


حال بر روی جدول مربوطه مجددا راست کلیک کرده و از گزینه Full-Text Index زیر منو start full population را انتخاب کنید تا عملیات ایندکس گذاری آغاز شود.

آموزش Full Text Search


از این لحظه می توانید بر روی Table خود دستورات مربوط به full text search را اجرا کنید.

فرایند ساخت Full-Text Search  در این مرحله به پایان رسید.

جستجو با استفاده از Full-Text Search

()FREETEXT

برای جستجو بر روی ستون هایی که دارای محتوای کاراکتر هستند (character-based data types) از تابع  ()FREETEXT استفاده می کنیم. این تابع کلمات درون یک رکورد را بررسی و سپس رکوردهایی که دارای این کلمه باشند را بازیابی می کند.

()CONTAINS

تابع ()CONTAINS مشابه تابع ()FREETEXT است با این تفاوت که شما می توانید چندین کلمه را برای جستجو با استفاده از دستورات AND , OR ترکیب کنید.

در زیر ما 3 مثال را بررسی کرده ایم

آموزش Full Text Search


در این مثال ما به دنبال کلمه Ernst در کل این جدول و تمامی فیلدهایی که full text index حضور دارند می گردیم.

SELECT * FROM [Customers] WHERE FREETEXT(*,'Ernst')

در این مثال ما به دنبال کلمه Ernst یا preparadas در فیلد [CompanyName] می گردیم.

SELECT * FROM [Customers] WHERE CONTAINS([CompanyName],'Ernst OR preparadas')


در این مثال ما به دنبال کلمه Ernst و preparadas در فیلد [CompanyName] می گردیم.

SELECT * FROM [Customers] WHERE CONTAINS([CompanyName],'Ernst AND preparadas')

آموزش کار با Full-Text Search در ASP.NET MVC به کمک LINQ

همانطور که در ابتدا گفتیم ممکن است شما بخواهیم جستجو خود را بر روی چندین جدول انجام دهید. برای اینکار می بایست Index View ایجاد کنید برای انجام اینکار کافی است تنها به جای انتخاب یک Table بر روی View مورد نظر خود راست کلیک کرده و سپس تمامی مراحل بالا را مجددا انجام دهید.

نحوه استفاده از Full Text Search در LINQ و Entity Framework

LINQ to SQL اجازه می دهد شما دستورات LINQ خود را درون NET. بنویسید و سپس این دستورات به SQL Server تبدیل خواهند شد. LINQ بسیاری از افعال و دستورات SQL Server را پشتیبانی می کند اما متاسفانه هنوز برخی از دستورات SQL Server را نمی توان در LINQ به کار برد.

یکی از دستوراتی که هنوز در LINQ پشتیبانی نمی شوند دستورات مربوط به Full-Text-Search هستند.

مانند:  CONTAINS, CONTAINSTABLE,FREETEXT, FREETEXTTABLE.


بدین معنا که شما نمی توانید دستور زیر را اجرا کنید:

var mySearchList = from s in new SQLBitsDataContext().sessions
                  where s.Contains("Description,Title","simon")
                 select s;


اما شما می توانید دستور زیر را اجرا کنید:

var mySearchList = from s in new SQLBitsDataContext().sessions
                  where s.description.Contains("simon")
                 select s;


با توجه به دستور بالا ممکن است شما فکر کنید، دستورات Full-Text-Search توسط LINQ پشتیبانی شوند. متاسفانه دستور Contains بالا به دستور ساده LIKE تبدیل می شود. حاصل تبدیل کد LINQ بالا کد SQL Server زیر خواهد بود.

select * from sessions where description like '%simon%'


راه حل این مشکل استفاده از دستور زیر می باشد.

استفاده از Full-Text Search در LINQ

var list = _context.Database.SqlQuery<customer>
(" SELECT * FROM [Customers] WHERE FREETEXT(*,@keywords)",
new SqlParameter("keywords", searchString)).ToList();


در قسمت SqlQuery<customer> مقدار customer مشخص کننده نوع خروجی این دستور یا در واقع نوع entity type ایی است که بازیابی می شود.

روش های دیگری نیز وجود دارند اما این ساده ترین و سریعترین روش ممکن برای استفاده از full text search در LINQ همین روش می باشد.

نظرات

  • Hannah Martinez
    mahboobe
    دو شنبه 11 دی 1278 - 0:00

    با سلام من چندین تا جذول دارم که میخوام روی اکثر فیلدها سرچ رو داشته باشم بعضیاش از نوع true/false هس من میخوان مثلا بگم فردی رو پیدا کن که در دبیرستان در فلان سمینار شرکت نکرده و فلان کتاب رو خونده یا در نوجوانی سوسیس استفاده کرده. ببینید من تعداد جذولام خیلی زیاده و میخوام یک تکست داشته باشم ک کاربر فیلدهای کلیدی رو مثلا به فرمت بالا بنویسه و در نهایت جواب آورده بشه چطور میتونم این کار رو انجام بدم ممنونم

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام


      برای ایجاد full-text search بر روی چندین جدول باید از view استفاده کنید. که در همین آموزش توضیحاتی ارائه شده است. در خصوص شرطها هم طبیعتا باید شرط های خود را ایجاد مانند روش معمول ایجاد کنید یا از روش شرط گذاری خود full-text search استفاده کنید.

      موفق باشید

  • Hannah Martinez
    قاسم
    دو شنبه 11 دی 1278 - 0:00

    سلام

    ممنون بابت آموزش ...
    اگه روی یه جدول فول تکست رو اعمال کنیم ، میشه توی یک پروسیجر که جدول مورد نظر با دو تا جدول دیگه جوین شده از همون فیلدی که واسه اش فول تکست ایجاد کردیم استفاده کنیم !؟

    با تشکر

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام

      در اینجا بهتر است به جای Table از View استفاده کنید و Full Text Search را بر روی View مورد نظر خود ایجاد کنید.

      موفق باشید

  • Hannah Martinez
    اسماعیل
    دو شنبه 11 دی 1278 - 0:00

    با سلام

    ممنون از مطلب مفید و به جاتون
    ممنونم

  • Hannah Martinez
    shima
    دو شنبه 11 دی 1278 - 0:00

    خیلی ممنون از مطلب بسیار اموزنده تون خسته نباشید

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام

      بنده نیز از لطف شما سپاسگذارم

  • Hannah Martinez
    negarmni
    دو شنبه 11 دی 1278 - 0:00

    با عرض سلام ممنونم از سایت خوبتون

    من یه سوال دارم من در sql 20 تا جدول ساختم و یک ویو از کل جدول ها طبق متنی که گذاشتید پیش رفتم که بتونم از ویو کاتالوگ بسازم

    اما وقتی ویزارد باز میشه خطای به من میده به معنی اینکه باید ستون یونیک داشته باشم..

    میشه لطفا راهنماییم کنید؟ هذف من ساخت یک inverted index از 20 تا جدولم هست..

    اگر راهی جز این داره ممنون میشم راهنماییم کنید... خیلی عجله دارم چون تحویل پروژه دارم

  • Hannah Martinez
    maede
    دو شنبه 11 دی 1278 - 0:00

    چطوری میتونم از Full-Text Search برای سرچ توی همه ی جداولم در LINQ استفاده کنم؟

    • Judith Bell
      پاسخ
      سیناحسینی
      دو شنبه 11 دی 1278 - 0:00

      باید view بسازید.بعدا روی view اینکار انجام دهید.همین سوال قبلا در قمست نظرات پاسخ داده شده است.

  • Hannah Martinez
    مسعود
    دو شنبه 6 آبان 1398 - 22:57

    سلام خیلی خوب بود سایت شما.

    بعضی سایت ها فقط بلدن کپی برداری کنن از بقیه، البته بلا نسبت سایت گرانقدر شما.

    یه خواهش بزرگوار ،

    مطالب اضافی را اصلاح و توضیحات را کوتاه تر و کاربردی تر و با زبانی عامیانه و همراه مثال های معمولی روزمره بیان بفرمایید.

    از همکاری تان ممنونم

    با تشکر

نظرات یا سوالات خودرا با ما درمیان بگذارید

0912 097 5516 :شماره تماس
0713 625 1757 :شماره تماس