PDA

View Full Version : کــار Full Text Search رویاد بگیریم!!!



mhsn_Danger
چهارشنبه 20 دی 1391, 16:41 عصر
بسم الله الرحمن الرحیم
اللهم عجل لولیک الفرج

با سلام خدمت همگی

چون مبحث FullText Search خیلی جذاب و کارا هست مناسب دبدم دست نوشته ای در این باره در سایت قرار بدم شاید به درد کسی خورد و ازش استفاده کرد.

در اینجا از SQL Server و برای ذخیره ی فایل ها از C#‎‎‎‎ استفاده میکنیم.

آموزشی که قرار دادم درباره ی ذخیره ی فایل های pdf در بانک اطلاعاتی و جستجو در بین آنها با استفاده از ویژگی Full Text Search هست.

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

توضیح بالا رو از سایت آقای حـــــامد بنـــایـــــی (http://hamedb.com/fa/posts/items/full_text_search_index_871016.aspx) آوردم!!

و اینکه باید IFilter مربوط به هر نوع فایلی را به sql server معرفی کرد. یک سری از فایل ها مثل .aspx, .doc و ... رو به طور پیش فرض ساپورت می کند و لی برای فایل های pdf ما باید Adobe IFIlter و یا Foxit IFilter رو به sqlserverمعرفی کنیم.

من با Foxit IFIlter کار می کنم.(پیکر بندی و بهتر بگم نصب اون فرقی با adobe نداره)ابتدا باید بانک و جداول مربوط به اون رو بسازیم.

پس اول بانک اطلاعاتی خودمون رو در محیط Sql Management Studio می سازیم.
یک جدول با فیلدهای مورد نیاز داخل بانک درست می کنیم که باید حداقل فیلدهای زیر رو داشته باشد.

Id که باید PrimaryKey تعیین بشه.
Pdfکه باید از نوعvarBinary(MAX) باشه که محتویات فایل pdf ما رو نگهداری می کنه.
Ext که پسوند فایل ما رو نگهداری می کنه. یعنی ما می تونیم از همین جدول برای نگهداری از چند نوع فایل استفاده کنیم. ولی باید پسوند فایل مورد نظر رو در این فید ذخیره کنیم. ما در اینجا برای تمام رکوردهامون از پسوند .pdf استفاده خواهیم کرد. من از نوع varchar(50) گرفتم این فیلد رو.(نخندید؛ به امید روزیکه پسوند فایل ها 50 تایی هم بشه!!!)

حالا باید Foxit IFilter رو نصب کنیم. از این (http://www.foxitsoftware.com) آدرس می تونید IFilter مخصوصFoxit رو دانلود و نصب کنید. البته لایسنسش 30 روزه هست.(اگه کسی کرکش کرد یا کرکشو پیدا کرد بذاره. اگه هم
Adobe IFilter روکسیمیتونه مستقیم همین جا Upload کنه که عالی میشه) و البته منتظر هیچگونه محیط ویژوال برای اون نباشید چون فقط یک سری dll ها هست که کمکsql server برای جستجو میکند.

بعد از نصب IFIlter مربوطه باید اون رو رجیستر کنیم. که با دو خط کد زیر این کار انجام می شود:


Exec sp_fulltext_service 'load_os_resources', 1






Exec sp_fulltext_service 'verify_signature', 0


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

حالا باید سرویس sql Server رو Restart کنید.
در مسیر زیر :


lick Start > Programs > Microsoft SQL Server 2005 > Configuration Tools > SQL
Server Surface Area Configuration


می تونید سرویس مربوط به sql و full text search رو Restart کنید.
حالا با کد زیر مطمئن شوید که کار رجیستر شدن IFilter صحیح انجام شده:


select document_type, path from sys.fulltext_document_types where document_type = '.pdf'


حاصل کوئری بالا باید شبیه تصویر زیر باشد

حالا باید تنظیمات بانک رو برای استفاده از Full Text Search انجام بدهیم. اول باید ببینیم که این ویژگی رو نصب کردیم یا نه. کد زیر به ما کمک میکن و اگر مقدار 1 را برگرداند یعنی این ویژگی فعال است و اگر 0 را برگرداند یعنی نصب نشده.


print FULLTEXTSERVICEPROPERTY('IsFullTextInstalleds’)


اگر نصب نبود باید Component و Service رو نصب کنید.
وقتی از نصب بودن اون مطمئن شدیم باید این ویژگی رو فعال کنیم. دستور زیر این کار رو انجام می دهد.


exec sp_fulltext_database 'enable'


حالا بایذ یک full text Catalog ایجاد کنیم البته با دستور زیر:


create fulltext catalog MyCatalog


ما باید یک Unique Index ایجاد کنیم که با قرار دادن فیلد Id به عنوان Primary Key قبلا این کار انجام شده بود.
مرحله بعد اینه که ما Full Text Index رو ایجاد کنیم. کد زیر این کار رو برای ما انجام میدهد.


create fulltext index on dbo. pdftable (Pdf)
key index ui_pdfIndex on pdfCatalog
with change_tracking auto


البته تمام مراحل بالا رو میتونیم با استفاده از محیط خود Management Studio هم انجام داد.
برای جستجو ما یک پروسیجر می نویسیم که شبیه کد زیر هست.


SELECT Id,Title from pdftable Where Contains(Pdf,@item)


خوب الآن بانک ما برای استفاده از Full Text Search آماده هست.

اگه مشکلی نیست، ادامه بدیم.

spicirmkh
سه شنبه 03 بهمن 1391, 16:47 عصر
با سلام
این سوال را ببینید (http://barnamenevis.org/showthread.php?104085-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-Full-Text-Index-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%81%D8%A7%DB%8C%D9%84%D9%87%D8%A7%DB%8C-%D9%BE%DB%8C-%D8%AF%DB%8C-%D8%A7%D9%81&highlight=OPENROWSET+pdf)
متن pdf من انگلیسی می باشد و کلماتی را که در آن وجود دارد را جستجو می کنم ولی هیچ موردی را پیدا نمی کند.

لینک استاد ثباتی کار نمی کند
http://public-api.wordpress.com/wls/redirect.php?alias=jtkane&entryid=cns!33DA9EBF0ACF8558!537

با تشکر

mhsn_Danger
چهارشنبه 04 بهمن 1391, 08:01 صبح
با سلام
اول باید دلیل ادامه ندادن بحث رو براتون بگم و اون هم عدم استقبال از این موضوع بود که واسه من دلیلی نداشت که بحثی رو که لازم نیست ادامه بدم. و امـــا ....

در مورد موردی که سوال شده من لینکی که برای استاد ثابتی بود رو نتونستم ببینم. چنین وبلاگی وجود نداشت. به هر حال:
اول از همه باید ببینی که فایل pdf ی که شما دارید اصلا قابلیت جستجوی متن رو داره یا نه(احتیاج به توضیح بیشتر نداره)
بعد از اون باید پیکربندی sqlserver رو بررسی کنید. شما موارد بالا رو انجام دادید و به نتیجه نرسیدید؟

spicirmkh
چهارشنبه 04 بهمن 1391, 09:48 صبح
سلام
اولا باید از زحمات شما تشکر کنم اگر از بحث شما استقبال نشد بدلیل اینکه بحث شما پیشرفته است .

در مورد مشکل من متن pdf قابل جستجو است یعنی در داخل acrobat می توانم متن جستجو کنم و select کنم .
در مورد تنظیمات من از Adobe IFilter استفاده کرده ام و در دستور


select document_type, path from sys.fulltext_document_types where document_type = '.pdf'


مقدار برکشتی


document_type= .pdf
path = C:\Program Files\Adobe\Adobe PDF iFilter 9 for 64-bit platforms\bin\PDFFilter.dll


سپس این دستورات اجرا کردم



exec sp_fulltext_service 'load_os_resources', 1;
exec sp_fulltext_service 'verify_signature', 0;
go

create fulltext catalog pdfCatalog
create fulltext index on [dbo].[pdftable](pdf TYPE COLUMN FileExtension)
key index ui_pdfIndex on pdfCatalog
with change_tracking AUTO

INSERT INTO [dbo].[pdftable] (PDF) SELECT * FROM OPENROWSET(BULK 'D:\pdf\Ebook.pdf', SINGLE_BLOB) AS BLOB

SELECT * from pdftable Where Contains(Pdf,'common')


اما نتیجه جستجو خالی است

با تشکر

hashemi85sep
چهارشنبه 04 بهمن 1391, 11:02 صبح
سلام دوست عزيز
mhsn_Danger (http://barnamenevis.org/member.php?70030-mhsn_Danger)

اگه ميشه بحث رو ادامه بدين
درسته اين بحث حرفيه ولي يه جاهايي به كارمون مياد كه بايد از اين روش استفاده كينم

با تشكر از زحماتتون
زكات علم هم ياد دادن اونه :چشمک:

mhsn_Danger
چهارشنبه 04 بهمن 1391, 14:04 عصر
با عرض سلام

عزیزان لطف دارید.
و امــا در مورد دوست عزیزمون من مشکل خاصی در کدها ندیدم جز اینکه باید حتما در جدول پسوند فایل رو هم مشخص کنیم و در insertهامون هم پسون فایل رو لحاظ کنیم.

یعنی شما باید حتما مقادار 'pdf' رو در فیلدی که به عنوان پسوند فایلها در نظر گرفته اید وارد کنید.

با آرزوی ظهور مولای عزیزمان موفق باسید.
(انشاالله چند روزی عازم مشهدالرضا هستیم برای دعا برای فرج)

spicirmkh
چهارشنبه 04 بهمن 1391, 14:25 عصر
من بطور پیش فرض پسوند فایل را pdf گذاشتم
و این کد که استاد ثباتی است مه داده است اما جواب نداد



select document_type, path from sys.fulltext_document_types
where document_type = '.pdf'

use Temp
go


CREATE TABLE t1(
c1 INT IDENTITY PRIMARY KEY,
c2 VARBINARY(MAX),
c3 VARCHAR(10))

USE [Temp]
GO
ALTER FULLTEXT INDEX ON [dbo].[t1] ADD ([c2] TYPE COLUMN [c3])
GO
USE [Temp]
GO
ALTER FULLTEXT INDEX ON [dbo].[t1] ENABLE
GO



INSERT t1(c2,c3)
SELECT BulkColumn,'pdf' FROM
OPENROWSET( BULK 'D:\pdf\BS.pdf', Single_Blob) AS tmp
GO




SELECT * FROM t1
WHERE CONTAINS(*,N'steel')

EXEC sp_fulltext_service @action='load_os_resources', @value=1;

exec sp_fulltext_service 'update_languages';

exec sp_fulltext_service 'verify_signature', 0;



SELECT * FROM sys.fulltext_document_types order by class_id
-- C:\Program Files (x86)\Adobe\PDF IFilter 6.0\PDFFILT.dll

EXEC sp_help_fulltext_system_components 'filter'

EXEC sp_fulltext_service 'restart_all_fdhosts';





با عرض سلام

عزیزان لطف دارید.
و امــا در مورد دوست عزیزمون من مشکل خاصی در کدها ندیدم جز اینکه باید حتما در جدول پسوند فایل رو هم مشخص کنیم و در insertهامون هم پسون فایل رو لحاظ کنیم.

یعنی شما باید حتما مقادار 'pdf' رو در فیلدی که به عنوان پسوند فایلها در نظر گرفته اید وارد کنید.

با آرزوی ظهور مولای عزیزمان موفق باسید.
(انشاالله چند روزی عازم مشهدالرضا هستیم برای دعا برای فرج)

mhsn_Danger
چهارشنبه 04 بهمن 1391, 14:56 عصر
باز هم سلام

تنها راه حلی که به ذهنم میرسه reBuild کردن Fulltext Catalog هست. در sql server Managment رو بخش storage باید اون رو rebuild کنی.

یا حق(مهدی)

spicirmkh
چهارشنبه 04 بهمن 1391, 15:41 عصر
اینکار کردم نشد


باز هم سلام

تنها راه حلی که به ذهنم میرسه reBuild کردن Fulltext Catalog هست. در sql server Managment رو بخش storage باید اون رو rebuild کنی.

یا حق(مهدی)

arusha
دوشنبه 28 مرداد 1392, 11:12 صبح
آیا full text search این امکان رو داره که کلمات مشابه رو هم سرچ کنه. برای مثال کاربر کلمه "کتاب ها" رو که سرچ می کنه در نتیجه کلمات "کتاب ها" و "کتاب" و "کتابخانه" و دیگر کلمات مشابه رو بیاره ؟ آخه من امتحان کردم نشد. همچنین با full text search فاصله نمی شه گذاشت یعنی همین کلمه "کتاب ها" که بینش فاصله است رو خطا می ده . می شه منو راهنمایی کنید. بسیار سپاسگزارم