PDA

View Full Version : برای چک کردن متن عربی موجود در دیتا بیس چطور عمل کنیم؟



intel_amd
پنج شنبه 14 اسفند 1393, 12:36 عصر
متن عربی در دیتا بیس داریم , حال می خواهیم کوئری توسط like بگیریم که اگر در متن مثلا کلمه خاصی بود کوئری بگیرد اما متنی که در دیتا بیس وجود دارد اعراب دارد و متنی که کاربر وارد میکنه بدون اعراب است و انتظار دارد رکورد مورد نظرش بیاد در صورتی که کلمرو تا با اعراب وارد نکند دستور sql حتی اگه کلمه در متن باشه باز هم چیزی برنمیگرداند چون کلمه در دیتا بیس اعراب دارد و کلمه کاربر ندارد

bagherok
پنج شنبه 14 اسفند 1393, 12:49 عصر
با مثال بیشتر توضیح بده
=================
درهرصورت باید یکسان سازی صورت بگیره
===============================
اجباری هست که کلمات بصورت عربی تو دیتابیس قرار بگیرند.

intel_amd
پنج شنبه 14 اسفند 1393, 13:23 عصر
بله متن عربی هست و نمیشه بدون اعراب داخل دیتا بیس قرار دهیم
چطور میشه وقتی متن اعراب دارد کلمه بدون اعراب کاربر را کوئری گرفت و کلمه مشابه اعراب دار مورد کوئری قرار گیرد و بخاطر وجود اعراب آن را نادیده نگیرد , آیا توسط expresion pattern ها می شود کاری کرد؟

bagherok
پنج شنبه 14 اسفند 1393, 16:29 عصر
SELECT REPLACE( REPLACE( REPLACE('بِسْمِ','بِ','ب'),'سْ','س'),' مِ','م') like 'بسم'

intel_amd
پنج شنبه 14 اسفند 1393, 17:20 عصر
کلمه ای که داخل like قرار میگیرد را از کاربر دریافت میکنم یک کلمه ثابت که نیست

bagherok
پنج شنبه 14 اسفند 1393, 17:28 عصر
کلمه ای که داخل like قرار میگیرد را از کاربر دریافت میکنم یک کلمه ثابت که نیست
مگه من گفتم ثابته!
اون واسه این بود که تست کنید.

column_name نام ستون
pattern هم کلمه ای هست که قراره جستجو بشه

REPLACE ها هم برای نرمال سازی هست
مثلا اگه مقدار column_name برابر با 'بِسْمِ' باشه
بعد از نرمالسازی به 'بسم' تبدیل میشه
و بعد مقایسه میشه با pattern که مقدارش برابر با 'بسم' باشه

پس تنها کاری که میمونه اینه که REPLACE کنید تمام حروف رو
من فقط برای 3 تا حرف نوشتم
حالا شما باید کامل کنید این REPLACE ها رو


REPLACE(.....REPLACE( REPLACE( REPLACE(column_name,'بِ','ب'),'سْ','س'),' مِ','م')......)









SELECT *

FROM table_name

WHERE REPLACE( REPLACE( REPLACE(column_name,'بِ','ب'),'سْ','س'),' مِ','م') LIKE pattern;

intel_amd
پنج شنبه 14 اسفند 1393, 18:36 عصر
منکه متوجه نشدم منظورتون چیه , ببینین ما مثلا 20 صفحه متن عربی با اعراب در یک فیلد رکورد دیتا بیس داریم و دیتابیس هم شامل حداقل 1000 رکورد مثل این هست
حالا یوزر مثلا مینویسه بسم بدون اعراب و حال اگر با فیلم های رکورد های دیتابیسمون like کنیم بسم های داخل فیلدها چون اعراب دارند و متنی که یوزر نوشته نداره هیچی برنمیگرده

bagherok
پنج شنبه 14 اسفند 1393, 18:39 عصر
دیگه از این واضح تر نمیشد!

شما Query تون رو اینجا بنویسد
تا نرمال شدش رو بنویسم
تا ببنید و تست کنید

intel_amd
پنج شنبه 14 اسفند 1393, 18:41 عصر
ببینید تنها راهش اینه که مینویسم فقط نمیدونم چطور تو دیتابیس اینو عملی کنم
کلمه یوزر هرچی هستو تک تک حرف به حرف کنیم و بعد باهاش یک expression pattern به شکل زیر بسازیم
مثلا بسم = ب*( ِ| ُ| َ )*س*( ِ| ُ| َ )*م
حالا اینو با مقادیر فیلد ها like کنیم اینجوری هر کلمه ای داخل دیتا بیس که basm , besm , bosm , besem , basam , basom , besom , besam , bosom , ... خلاصه همه کلاماتی که کلیه حالات اعراب بر روی این 3 حرف بسم باشرو بهش جواب میده و برمیگردونه که منم همینو میخام

intel_amd
پنج شنبه 14 اسفند 1393, 18:45 عصر
نحوه کارشم به این شکله که داخل پرانتز ها چون ستاره خوردن هم میتونن باشن هم میتونن نباشن یعنی خود کلمه بسم بدون اعراب هم برگردونده میشه و | ها معنی یا میدن یعنی اینکه رو هر حرفی یکی از این اعراب میتونه پذیرش بشه این یک نوع آتاماتا هست که تو کد بهش میگیم expression pattern که با کدنویسی اینو پیاده کردم فقط مشکل اینه که sql انگار likesh با expression pattern ها سازگار نیست یا من نمیدونم

bagherok
پنج شنبه 14 اسفند 1393, 18:48 عصر
بله تنها راهش همینی هست که شما میگید:متفکر::اشتباه:

intel_amd
پنج شنبه 14 اسفند 1393, 18:53 عصر
دوست عزیز چرا ناراحت میشی !!!!!
مگر مقادیر داخل فیلد های من 1 کلمه ای هستن که ریپلیسشون کنم تو هر فیلدی حداقل 20-30 صفحه متن عربی با اعراب وجود داره و یا نکنه تصور میکنید متن ها بدون اعراب هستند و کلمه ای که یوزر مینویسه اعراب داره؟ 100% یک جا اشتباه دارین میکنید اگر جواب بود که من از خدام بود !!

intel_amd
پنج شنبه 14 اسفند 1393, 19:08 عصر
اگر من بخام اینهمه متن عربیو ریپلیس کنم که شما می فرمائید برخی صفحلات 100 صفحه یا 120 صفحه هم هستند شایدم بیشتر اینجوری خیلی cpu و زمان میگیره و هنگ میکنه

bagherok
پنج شنبه 14 اسفند 1393, 20:26 عصر
خب چرا از Full-Text Search استفاده نمیکنید.
==================================

البته فک میکنم mysql مشکل خاصی با Regular Expressions نداره

http://dev.mysql.com/doc/refman/5.1/en/regexp.html

درضمن
چطوری میخوایید بین این دو تفاوت قایل بشید

ؤ == ؤ
ؤ == و + ٔ


یعنی اگه من جستجو کنم یوسف


SELECT 'يؤسف' REGEXP 'يو( ٔ)*سف'

که خروجی 0 هست

MMSHFE
جمعه 15 اسفند 1393, 09:15 صبح
همزه قضیه اش فرق میکنه و واقعاً خودش یه کارکتره (بین یوسف و یؤسف فرق هست). شما ابتدا با REPLACE باید کارکترهای اعراب رو از فیلد حذف کنید و بعد با LIKE کار کنید. مثال:
SELECT * FROM `table` WHERE (REPLACE(`text`, 'ُ', '') LIKE '%کتب%')
البته باید چند تا REPLACE تودرتو بزنید و با کمک اونها همه کارکترهای اعراب رو حذف کنید (توی مثال من فقط ُ رو گذاشتم).

MMSHFE
جمعه 15 اسفند 1393, 09:22 صبح
یک راه دیگه استفاده از Collation عمومی utf8_unicode_ci و استفاده از Fulltext Search هست.
البته یک ترفند هم میشه زد و اونم اینه که شما همراه خود متن یک فیلد دیگه هم داشته باشین که متن بدون اعراب رو داخلش بگذارین و جستجو رو روی اون انجام بدین. درسته افزونگی حجم داره ولی سربار کمتری توی جستجو میگذاره و معمولاً حجم بیشتر رو ارزونتر از پردازنده قویتر میتونید تأمین کنید. کافیه موقع جستجو یکبار با PHP کارکترهای اعراب رو حذف کنید (برای وقتی که کاربر با اعراب نوشته بود) و بعد این عبارت جدید رو توی فیلدی که متن بدون اعراب داخلش هست، جستجو کنید.

bagherok
جمعه 15 اسفند 1393, 09:31 صبح
یک راه دیگه استفاده از Collation عمومی utf8_unicode_ci و استفاده از Fulltext Search هست.
منظورتون اینه که حتما درکنار هم باید استفاده بشند دیگه

چون Collation عمومی utf8_unicode_ci به تنهایی تو لایک جواب نمیده

MMSHFE
جمعه 15 اسفند 1393, 10:06 صبح
بله دوتا با هم باید بکار گرفته بشن. LIKE خیلی محدوده.

intel_amd
جمعه 15 اسفند 1393, 16:20 عصر
احتمالا دقت میشه که فیلدی که یوزر پر میکنه بدون اعراب پر میشه و متنی که داخل دیتا بیس هست اعراب داره , دیگه؟

bagherok
جمعه 15 اسفند 1393, 16:26 عصر
احتمالا دقت میشه که فیلدی که یوزر پر میکنه بدون اعراب پر میشه و متنی که داخل دیتا بیس هست اعراب داره , دیگه؟

بله.......