PDA

View Full Version : آموزش : *جستجوهای قدرتمند با استفاده از Full Text Search*



maxpayn2
جمعه 14 دی 1386, 11:44 صبح
سلام
یه مقاله خوندم در باره استفاده از Full text Search ، میخواستم لینکش رو بزارم اینجا ولی جناب آقای بهروز راد (مدیر قسمت ASP.NET) فرمودند لینکهایی که احتیاج به login داره رو تو سایت نزارم من هم با اجازه از نویسنده مقاله اون رو اینجا میزارم :

جستجوهای قدرتمند , استفاده از Full Text Search
نویسنده مطلب : مهدی خسروی
منبع : DotNetSource.Com - DNS

یک مثال: فرض کنیم چنین عبارتی را در یک فیلد داریم و در رکوردهای مشابه نیز به همین حجم .
"به موجب مادة 7 قانون چک بلامحل مجازات فاعل، حبس تعزیری تعیین، ولی در مادة 13 همین قانون نوع حبس (تعزیری یا باز دارنده) قید نگردیده است، از طرفی مادة 12 قانون مجازات اسلامی انواع مجازاتها را به حدود، قصاص و دیات و تعزیرات و مجازاتهای باز دارنده تقسیم و هر کدام را تعریف نموده است، لذا با توجه به مقدمة فوق، آیا مجازات مقرر در مواد 7 و 13 قانون صدور چک بلامحل از نوع تعزیری است یا بازدارنده؟ و آیا می‌توان محکومان صدور چک بلامحل را مشمول مواد 173 قانون ‌آیین ‌دادرسی دادگاههای عمومی و انقلاب که منحصراً مربوط به اشخاصی که محکومیت از نوع مجازاتهای بازدارنده تحصیل نموده‌اند تسری داد یا خیر؟
توضیح:
یکی از مباحث مهمی که در بین فقها مطرح است در مورد قلمرو اعمال مجازات تعزیری به عبارت دیگر افعال قابل تعزیر است. در این خصوص بین فقها چهار نظر وجود دارد:
الف. عده‌ای معتقدند اساسا عملی قابل تعزیر است که شرعاً حرام باشد(به خاطر ارتکاب فعل حرام یا ترک واجب) که آن¬چه از کتابهای فقهی بر می‌آید قول مشهور فقها هم این نظر است.
ب. عده¬ای دیگر اعتقاد دارند هر فعل حرام یا ترک واجب قابل تعزیرنیست بلکه عملی قابل تعزیر است که از «گناهان کبیره» باشد.
ج. برخی را نیز عقیده بر این است، عملی قابل تعزیر است که اولاً : در شرع حرام شده باشد، ثانیاً : در شرع قابل تعزیر شناخته شده باشد ثالثاً : مقدار هم معین شده باشد.
د. این دسته می‌گویند عملی قابل تعزیر است که منجر به اضرار به غیر شود، به عبارت دیگر، هر عملی که مفسده زا باشد می‌تواند ملاک تعزیر قرار گیرد.
با توجه مفاهیم داده شده می‌توان، حرام را به حرام شرعی و حرام عقلی و واجب را به واجب شرعی و واجب عقلی تقسیم نمود که حرام و واجب شرعی همان است که توسط شارع مقدس تعیین شده و حرام و واجب عقلی همان است که عقلای جهان بر قبح آن اتفاق دارند. همانند جرایم رانندگی یا جرم صدور چک بلامحل.
بنابراین از نظر فقهی، جرایم موجب تعزیر دو دسته¬اند :
1. جرایمی که همواره در جامعه وجود داشته و به عنوان جرم شناخته شده و در زمان شارع هم بوده است، اعم از تعزیرات معینه مثل وطی با بهایم و غیر معینه مثل اعمال منافی عفت غیر از زنا که به این¬ها «تعزیرات شرعی» می‌گویند.
2. دسته دوم جرایمی که بر حسب زمان و مکان از ناحیه حکومت تعریف و ارتکاب آنها موجب الزامات یا ممنوعیت¬های حکومتی مجازات تعزیری است که هم اکنون ما آنها را تعزیرات حکومتی یا مجازات بازدارنده می‌نامیم."

حال می خواهیم جستجویی داشته باشیم که به دنبال کلمه ی محکومیت در یک چنین رکوردی بگردیم. فرض می کنیم اسم فیلد question میباشد با این خط کد می توانیم این کار را انجام دهیم:
کد:

SELECT * FROM t_question WHERE question LIKE '*محکومیت*'


بله, همانطوری که گفتم نتیجه بازگردانده خواهد شد اما به مدت طول یک عمر! هرچقدر تعداد رکورد ها بیشتر شود مدت زمان نیز ....! در این هنگام تنها چیزی که به کمک ما می آید Full Text Indexing می باشد که در زیر در مورد آن صحبت می کنیم.

یکی از امکانات جالب و قدرتمند SQL Server که از نسخه 7 به بالا اضافه شده است Full Text Search میباشد.

ابتدا باید کاتالوگهایی ایجاد شوند و بعد از آن جداولی که قرار است روی آنها جستجوهای حجیم انجام شود را به این کاتالوگها اضافه نمود و در نهایت نیز باید فیلدهایی که قرار است جستجو بر روی آنها انجام شوند تعیین خواهد شوند. حال شما میتوانید بروی این جدول و فیلدهایی که کاندید شده اند جستجوهایی متنی کامل(full text) و یا جستجوهای مفهومی داشته باشید.

در جستجوی مفهومی نیز شما میتوانید با جملات انگلیسی از بانک اطلاعاتی سئوال کنید مثلا:"what "What is JAVA" و بانک اطلاعاتی جوابهای سوال شما را بصورت لیست از رکوردها که به آن مربوط میشود خواهد داد. از سوی دیگر شما در جستجوهایتان میتوانید بگویید که مثلا به دنبال کلمه eat بگرد و حالتهای ماضی و مضارع آن را(ate و eating) نیز اگر وجود دارد بیاور.

لازم به ذکر است که شما میتوانید stopwordها و یا کلمات زاید را تعریف کرده و عملیات ایندکس سازی و به پیرو آن جستجو روی آن ها انجام نشود مانند:the,and, است , بود , .....

معایب :
1- ایجاد یک Full Text Index کار زمانگیری بوده و باید دقیق انجام شود (اما به زحمتش می ارزه!!)

2- رکوردهای جدید و یا ویرایش شده باید سرشماری(population) شوند تا بتوان روی آن جستجو کرد که این نیز خود مشکلات زیادی را ایجاد میکند.(کمی تجربه این مشکلات را هم براحتی حل می کند!!)

3- امکانات جستجوی مفهومی آن تنها برای زبان انگلیسی میباشد.(می توان این کار را برای زبان فارسی و دیگر زبان ها انجام داد اما یک انسان از خود گذشته باید پیدا شود تا کلمات و هم خانواده ها و ماضی و مضارع و غیره و غیره را برای این انجین تعریف کند)

4- کار کردن با آن برای زبانهای غیر انگلیسی از جمله فارسی مشکلات و تنظیمات خاصی نیاز دارد.(که البته در نسخه ی 2005 مشکلات خیلی خیلی کم شده اند و بهتر است بگویم تقریبا مشکلی وجود ندارد.)

5- فرمت دستورات آن مختص SQLServer بوده و از استانداردها تبعیت نمیکند.

کمی چرت و پرت :
1- ابتدا باید مطمئن شوید که فول تکست را هنگام نصب اسکیوال نصب کرده اید.
2- این قابلیت را برای بانک خود فعال کنید, برای آگاهی از فعال بودن آن این کد کمکتان می کند:
کد:

SELECT DatabaseProperty ('DBNname','IsFulltextEnabled')


اگر خروجی صفر باشید یعنی تا فعال نیست پس باید فعال شود:
کد:

EXEC sp_fulltext_database 'enable'

sp_configure "show advanced options",1
reconfigure


شما به هر تعداد که بخواهید میتوانید کاتالوگ تعریف کنید ولی در اسکیو ال 7 بیش از 5 کاتالوگ اکیداً توصیه نمیشود و با مشکلاتی روبرو خواهید شد!!!

3- برای ایجاد کاتالوگ نام آنرا در این دستور وارد کنید:
کد:

exec sp_fulltext_catalog 'CATName+','create'


4- این اندکس ها در کاتالوگ ها ذخیره می شوند جدول های مورد نظر خود را به این کاتالوگ ها اضافه کنید:
کد:

exec sp_fulltext_table 'TableName','create','CATName','IndexFieldName'


5- حال نوبت افزودن فیلدها به کاتالوگ است:
کد:

EXEC sp_fulltext_table TableName,'deactivate'
EXEC sp_fulltext_column TableName,FullTextFieldName,'add'
EXEC sp_fulltext_table TableName,'activate'


6- برای اجرا سرشماری نیز از این دستورات استفاده کنید(توجه داشته باشید که دو نوع وجود دارد که برای اطلاعات بیشتر به BooksOnline مراجعه کنید(:

کد:

EXEC sp_fulltext_catalog 'CATName','start_full'

EXEC sp_fulltext_catalog 'CATName','start_incremental'


وقتی سرشماری انجام شد می توانید کوئری های خود را اجرا کنید:

کوئری که در بالا داشتیم و عبارت محکومیت را جستجو می کرد به این صورت در خواهد آمد اما اینبار در کسری از ثانیه پاسخ خواهد داد:
کد:

SELECT * FROM t_question WHERE CONTAINS(question,'محکومیت')


می توان جستجو های ترکیبی نیز داشت که این کار با دلالت کیورد هایی مثل AND OR و ... انجام خواهد شد. مثلا دنبال رکوردی می گردیم که علاوه بر عبارت محکومیت شامل عبارت شرع نیز باشد. به این صورت:
کد:

SELECT * FROM t_question WHERE CONTAINS(question, '"محکومیت" and "شرع"'(

نمونه ای نیز از دستورات مربوطه:

کد:

SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' "choc*" ')

کد:

SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, 'spread NEAR Boysenberry')

کد:

SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' FORMSOF (INFLECTIONAL, dry) ')

حتما یک سری به BooksOnline هم بزنید.
نکته ی دیگر این است که تمامی مراحل ایجاد کاتالوگ و افزودن جدول به کاتالوگ و راه اندازی Full Text Search برای بانک و ... و .... همگی از طریق ویزاردها قابل انجام شدن می باشند.

rezaei manesh
دوشنبه 27 خرداد 1387, 11:52 صبح
با سلام
من یک فیلد دارم از نوع ntextو فول تکس سرچ رو برای اون فعال کردم
حالا می خوامدر مورد سرشماری بیشتر بدونم
2 خط کد برای سرشماری گذاشتید اگه میشه یکم در مورد هر کدوم توضیح بدید
برای من کدوم گزینه مناسب هست چه زمان باید سرشماری کنیم هر موقع جدول تغییر پیدا می کنه یا هر موقع جستجو صورت می گیره؟


EXEC sp_fulltext_catalog 'CATName','start_full'

EXEC sp_fulltext_catalog 'CATName','start_incremental'

Sub Zero
دوشنبه 27 خرداد 1387, 13:41 عصر
لطفا برای خوانایی بیشتر کدها رو در تک کد قرار بدید . ممنون

rezaei manesh
سه شنبه 28 خرداد 1387, 10:50 صبح
سلام
کسی نیست یکم توضیح بده؟
برای جستجو در صفحات pdf و html و aspx بهترین کار چیه؟
آیا باید صفحات رو در یک جدول به صورت باینری برای pdf و ntext برای بقیه ذخیره کرد و با قابلیت fullText Search درون اونها جستجو کرد؟
اگر اره یکم توضیح بدید یا مثال بزنید
در مورد سرشماری هم راهنمایی کنید.
این FTS امکاناتی برای های لایت نداره؟ اگه داره مثال
با تشکر

rezaei manesh
شنبه 01 تیر 1387, 14:17 عصر
سلام
چرا کسی از دوستان راهنمایی نمی کنه؟

maxpayn2
سه شنبه 17 فروردین 1389, 07:35 صبح
سلام
یه مقاله خوندم در باره استفاده از Full text Search ، میخواستم لینکش رو بزارم اینجا ولی جناب آقای بهروز راد (مدیر قسمت ASP.NET) فرمودند لینکهایی که احتیاج به login داره رو تو سایت نزارم من هم با اجازه از نویسنده مقاله اون رو اینجا میزارم

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

sia_2007
سه شنبه 17 فروردین 1389, 14:01 عصر
خب اصل زحمات رو که دوستان کشیدن
ببینید دوستان در جستجوهای زیاد در متون طولانی و هم چنین جستجو درون فایلها؛ که اولی در حالت عادی کند و دومی غیر ممکن است؛ از Full Text Search استفاده میشود.
ببینید شما یک ستون Var Binary دارید که فایل رو درون اون قرار میدید.
و سپس یک ستون هم دارید که پسوند فایل رو مشخص میکنه و به SQL میگه که با یک مشت صفر و یک در هر ردیف چگونه برخورد بکنه؛ مثلا
[1] [PDF.] [.PDFآموزش ]
حال باید یکسری DLL باشند که بیایند و ساختار فایل را به SQL بشناسانند.
خود SQL تعداد نسبتا خوبی DLL دارد؛ اما مثلا PDF ندارد؛ و شما باید DLL های مد نظرتون رو پیدا کنید.
مثلا برای PDF شما باید iFilter 6 رو از Adobe دانلود کنید. به حجم تقریبی 10 مگابایت
و بعد باید DLL رو نصب کنیدو به SQL بشناسونید.
شما باید با کوئری نویسی جالب اون و نحوه ادمین کردنش آشنا بشید.
من خودم سرعت 33 برابری رو هم تجربه کردم.
بحث دیگه Hit Highlighting هست که شما باید بتونید وقتی یک کلمه رو پیدا کردید مثلا 100 حرف قبل و بعدش رو هم نشون بدید؛ درست مثل Google
اگر تایپ متن های شما nVarChar یا به طور کلی یونیکد نباشد؛ Casting داریم و Overhead
آقای رضایی منش؛ شما چه خیری از nText دیدید ؟! :چشمک:
در ضمن این امکان قدرتمند در 2005 با قابلیت Multi Instance در SQL Express مشکل داره و هم چنین رابط گرافیکی برای اون در 2008 اظافه شده.
بهتر است فایل های شما بر روی File Stream باشند و به جای استفاده از TDE از Bit Locker استفاده کنین.
در ضمن بهتر است قبل از نصب DLL ؛ کاتالوگها رو حذف کنین.
دوستان من تجربیاتم رو در اختیارتون گذاشتم
اینها خیلی دیرتر از یک مشت کد به دست میآیند.
و در نهایت برای دوستانی که عاشق کارهای پیشرفته هستند کتاب Apress Pro Full Text Search رو پیشنهاد میکنم.

rezaei manesh
سه شنبه 17 فروردین 1389, 18:03 عصر
ممنون که پاسخ دادی اما بعد از 2 سال بود این پاسخ من جواب ها رو تا حدی پیدا کردم و دارم از اون استفاده می کنم اما در مورد pdf روش رو در اون پروژه عوض کردم که دیکه نیاز به جستجو در بانک نیست

Mazda3
جمعه 03 اردیبهشت 1389, 19:35 عصر
کلا بیشتر در مورد این FULLL توضیح بدید ... خیلی گنگه

sia_2007
جمعه 03 اردیبهشت 1389, 20:08 عصر
از Search Server استفاده کردین ؟