PDA

View Full Version : تعداد تکرار در یک فایل PDF ذخیره شده در SqlServer



mhsn_Danger
دوشنبه 18 دی 1391, 20:10 عصر
بسم الله الرحمن الرحیم

سلام به همگی

چطوری میتونم تعداد تکرار یک کلمه رو در فایلی که در بانک ذخیره شده به دست آورد. در واقع می خوام کاربر مثلا کلمه ی Mahdi رو وارد کنه و من در بین فایل های ذخیره شده در بانک بگردم و فایلی که بیشترین تکرار کلمه ی Mahdi رو داره برگردونم.
لازم هست بگم که طبیعتا از full text search استفاده کردم. و باید انجام بدم.

از کمک های احتمالیتون هم متشکرم!

mohsen24000
دوشنبه 18 دی 1391, 21:04 عصر
متن سوالتون با عنوان تاپیک همخوانی نداره!
شما نمی تونید با دستورات اسکیوال داخل یک فایل پی دی اف ذخیره شده در بانک رو پیمایش کنید.

mhsn_Danger
سه شنبه 19 دی 1391, 09:53 صبح
بسم الله الرحمن الرحیم

با سلام دوباره
با دستورات Contains و freetext و ویژگی fulltext Search می شه داخل pdf هم سرج کرد که البته باید IFilter اون رو هم نصب کنیم.

حالا بحث اینه که من میتونم با این ویزگی ها به خواسته ی خودم در پست شماره یک برسم؟

ممنون

hassan_reza
سه شنبه 19 دی 1391, 17:07 عصر
حالا فایل ورد رو هم می شود جستجوی فول تکست کرد!؟

mhsn_Danger
سه شنبه 19 دی 1391, 21:18 عصر
سلام
بله، میتونید.
بسیار راحت هم هست. احتیاجی هم به نصب IFilter مخصوص نداره. بلکه بسیاری از فرمت ها رو به صورت خودکار خود sqlserver پشتیبانی می کنه. مثلا docx, aspx و ... .

اگر فرمت خاصی رو هم می خواهید استفاده کنید، باید IFilter مخصوص اون رو نصب کنید. که در واقع یک dll هست. برای فایل های PDF هم تعدادی IFilter وجود داره. Adobe IFilter هست، Foxit IFilter هم هست و ... .

البته اگه کسی بتونه جواب من رو که در پست یک مطرح کردم بده هم ممنون می شم!!

hassan_reza
سه شنبه 19 دی 1391, 21:48 عصر
یعنی نوع فیلد varbinary(max)باشه هم می توانیم روی آن فول تکست ایندکس گذاری کنیم؟
برای این قضیه نوع فیلد چی باشه؟

mohsen24000
سه شنبه 19 دی 1391, 23:02 عصر
نوع فیلدها باید یکی از موارد زیر باشه:
char, varchar, nchar, nvarchar, text, ntext, image, xml, or varbinary(max) and FILESTREAM.
فقط تنها موردی که می مونه، شما بایستی یک فیلد رو هم مشخص کنید که نوع فایل رو در خودش داشته باشه (“.doc”,”.pdf”, ….). تا هنگام ساختن ایندکس فول تکست، Typed by Column رو به اون نسبت بدید. تا اسکیوال سرور بدونه با محتویات فیلد باید چطور رفتار کنه و بر اساس کدام فیلتر نصب شده جستجو رو انجام بده.

mohsen24000
سه شنبه 19 دی 1391, 23:06 عصر
برای نصب فیلترهای فول تکست فایلهای آفیس به این لینک مراجعه کنید: Microsoft Filter Pack 2.0 (http://www.microsoft.com/download/en/details.aspx?id=17062)
این فیلتر شامل موارد زیر میشه:
Legacy Office Filter (97-2003; .doc, .ppt, .xls)
Metro Office Filter (2007; .docx, .pptx, .xlsx)
Zip Filter
OneNote filter
Visio Filter
Publisher Filter
Open Document Format Filter
پس از نصب هم دستورات زیر رو اجرا کنید:

EXEC sp_fulltext_service 'update_languages';
EXEC sp_fulltext_service 'load_os_resources', 1;
EXEC sp_fulltext_service 'restart_all_fdhosts';

mhsn_Danger
چهارشنبه 20 دی 1391, 10:53 صبح
سلام(و البته چندباره)
و واقعا به خودم می بالم که با یک تاپیک تونستم اینقدر باعث حل مشکلات بقیه بشم!! ولی ....

هنوز سوالم که به خاطر اون این تاپیک رو ساختم بی جواب مونده!!

محمد سلیم آبادی
چهارشنبه 20 دی 1391, 12:27 عصر
بسم الله الرحمن الرحیم

سلام به همگی

چطوری میتونم تعداد تکرار یک کلمه رو در فایلی که در بانک ذخیره شده به دست آورد. در واقع می خوام کاربر مثلا کلمه ی Mahdi رو وارد کنه و من در بین فایل های ذخیره شده در بانک بگردم و فایلی که بیشترین تکرار کلمه ی Mahdi رو داره برگردونم.
لازم هست بگم که طبیعتا از full text search استفاده کردم. و باید انجام بدم.

از کمک های احتمالیتون هم متشکرم!
سلام،
شما حتما میخواهین با full text search به جواب برسین؟ یعنی مثلا با دستورات خود tsql نمیشه اینکار رو انجام داد؟
یک تکنیک خیلی ساده هست که خودم برای محاسبه تعداد کلمات موجود در یک رشته از آن استفاده می کنم. که در ادامه شرح میدم:
فرض کنید میخواهیم همان کلمه Mahdi را در یک رشته جستجو کنیم و تعداد تکرارش را بدست آوریم.
گام اول(▄): اگر بین کلمات موجود در متن تنها یک فاصله وجود داشت آن را تبدیل به دو فاصله میکنیم توسط دستور زیر:

REPLACE(String, ' ', ' ')
گام دوم(▌): افزودن کاراکتر space اول و آخر رشته تولید شده در مرحله قبل.

' ' + ▄ + ' '
گام سوم: بدست آوردن تعداد تکرار کلمه مورد نظر در رشته توسط فرمول ساده زیر:

(LEN(▌) - LEN(REPLACE(▌, ' ' + 'Mahdi' + ' ', ''))) / (LEN('Mahdi') + 2)

mhsn_Danger
چهارشنبه 20 دی 1391, 16:44 عصر
با سلام

ممنون از توجهتون ولی یک نکته ای که باید مطرح بشه اینه که من وقتی یک Pdf رو ذخیره میکنم نمی تونم برای بررسی محتویات اون فایل از توابع مربوط به رشته استفاده کنم.(و دقیقا مشکل من هم همین هست).

یعنی در کل باید بگم که ما با یک سری بایت طرف هستیم(همانطور که می دونید نوع فیلد ما از نوع varBinary(MAX) هست). تمام مسائل مربوط به استخراج متن از فایل رو IFilter نصب شده انجام میده.
حالا من بین 500 فایل Pdf اون فایل هایی رو بازیابی کنم که کلمه ی مورد نظرکاربر(مثلا کلم ی مهـــدی) رو بیشتر داشته باشه.

اگه کسی با FullText Search آشنایی نداره به لینک زیرمیتونه سربزنه:

آموزش کار با ویژگی FullText Search (http://barnamenevis.org/showthread.php?378263-%DA%A9%D9%80%D9%80%D8%A7%D8%B1-Full-Text-Search-%D8%B1%D9%88%DB%8C%D8%A7%D8%AF-%D8%A8%DA%AF%DB%8C%D8%B1%DB%8C%D9%85!!!&p=1672254#post1672254)

ممنون میشم کسی راهنمایی کنه.

محمد سلیم آبادی
پنج شنبه 21 دی 1391, 15:17 عصر
گرفتم قضیه رو. حتی اگه بخواهیم نوع داده رو به varchar تبدیل کنیم با شکست مواجه خواهیم شد.
جالب اینجاست که بنده خدایی دقیقا مشکل شما رو داشته (یا هنوزم ممکنه داشته باشه) و ظاهرا 4 الی 5 سال پیش این مساله رو مطرح کرده تو یکی از سایت ها ولی کسی جوابی بهش نداده:
http://www.dbforums.com/microsoft-sql-server/1630340-does-full-text-search-could-count-words-occurrence-number.html

من پیگیر مسالتون هستم اگه به راه حلی رسیدم اینجا پست میکنم.