PDA

View Full Version : سوال: بهترین روش ساخت جستجو در مطالب سایت



maysam.m
شنبه 21 مرداد 1391, 01:20 صبح
سلام

من روی یه پروژه دارم کار میکنم که این سایت بالای چند صد هزار تا مطلب داره و میخوام یه بخش جستجو داشته باشم که فقط روی عناوین مطالب جستجو کنه ساده ترین راهی که به نظر میرسه استفاده از دستور like در mysql است.

اما چون این پروژه به مرور خیلی بزرگتر میشه فکر کنم این روش به مشکل بخوره و حداقل سرعتش کلی افت کنه.
به نظرتون روش دیگه هم هست که با دقت و با سرعت بیشتری این کارو بتونم اجرا کنم؟

ممنون

pejman_view
شنبه 21 مرداد 1391, 07:02 صبح
سلام

یک روشی برای موتور ذخیره سازی MyISAM در MySQL هست به نام "روش جستجوی فهرست وار متن" ، این روش یک تابع درون ساخته است که می تواند متن را از ستون های TEXT، Char و varchar با سرعت بالا پیدا کند، و نحوه استفاده از این تابع مانند زیر است:
SELECT title,comment FROM comments
WHERE MATCH (title,comment )
AGAINST ('+zelzeleh -bam' IN BOOLEAN MODE) HAVING Relevance > 0.2 ORDER
BY Relevance DESC

Match: در اینجا قرار است نام ستون هایی که باید جستجو در آن انجام شود وارد شود.
Against : رشته ایی که بایستی در ردیف های ستون های Match بایستی پیدا شود
+ : این علامت به MySql می گوید که، رشته ایی که بایستی پیدا شود حتماً شامل کاراکتر بعد از + باشد
- : این علامت به MySql می گوید که، رشته ایی که بایستی پیدا شود حتماً در آن کاراکتر بعد از - شامل نشده باشد
Relevance : خود MySQL رشته های یافت شده را اولویت بندی می کند که چقدر به جستجوی شما نزدیک است. و این را با Relevance نمایش می دهد.
order : بر اساس کوچک به بزرگتر یا کوچکتر به بزرگتر ردیف های یافت شده را می چیند.

اگر سوال بود در خدمتم
با آرزوی موفقیت

imanitc
شنبه 21 مرداد 1391, 08:57 صبح
من شرط sql مو اينجوري ميزنم مثلا
person.ID LIKE '%{$_REQUEST[ID]}%' AND fname LIKE '%$fname%' AND lname LIKE '%$lname%' AND melicode LIKE '%{$_REQUEST[melicode]}%' AND shsh LIKE '%{$_REQUEST[shsh]}%'

maysam.m
یک شنبه 22 مرداد 1391, 22:38 عصر
سلام

یک روشی برای موتور ذخیره سازی MyISAM در MySQL هست به نام "روش جستجوی فهرست وار متن" ، این روش یک تابع درون ساخته است که می تواند متن را از ستون های TEXT، Char و varchar با سرعت بالا پیدا کند، و نحوه استفاده از این تابع مانند زیر است:
SELECT title,comment FROM comments
WHERE MATCH (title,comment )
AGAINST ('+zelzeleh -bam' IN BOOLEAN MODE) HAVING Relevance > 0.2 ORDER
BY Relevance DESC

Match: در اینجا قرار است نام ستون هایی که باید جستجو در آن انجام شود وارد شود.
Against : رشته ایی که بایستی در ردیف های ستون های Match بایستی پیدا شود
+ : این علامت به MySql می گوید که، رشته ایی که بایستی پیدا شود حتماً شامل کاراکتر بعد از + باشد
- : این علامت به MySql می گوید که، رشته ایی که بایستی پیدا شود حتماً در آن کاراکتر بعد از - شامل نشده باشد
Relevance : خود MySQL رشته های یافت شده را اولویت بندی می کند که چقدر به جستجوی شما نزدیک است. و این را با Relevance نمایش می دهد.
order : بر اساس کوچک به بزرگتر یا کوچکتر به بزرگتر ردیف های یافت شده را می چیند.

اگر سوال بود در خدمتم
با آرزوی موفقیت

سلام

مرسی از توجهتون.

فیلدی که در اون جستجو میشه از نوع varchar ـه که فقط به صورت حروف انگلیسی است و توی یک جدول دیگر اون فیلد حروف فارسی و انگلیسی با هم است.
به نظرتون استفاده از این روش در رکوردهای بالا دچار مشکل نمی شود؟ چون ممکن است بعد از مدتی به تعداد چند میلیون هم برسد از طرفی هم استفاده از دستور like اصلا منطقی نیست!
از طرفی این روش با زبان فارسی که مشکل خاصی ندارد؟

pejman_view
یک شنبه 22 مرداد 1391, 23:19 عصر
سلام

بابت فارسی مشکلی نداره.
خوب پشت like و این تابع یک برنامه نویسی دقیق است که کمترین زمان و بیشترین رکورد را ساپورت کنند. که استفاده از like هم آنچنان غیر منطقی نیست چون فقط کوتاه بودن کوئری را نمی شه گفت غیر منطقی.
و برای دیتابیس های بزرگ سخت افزارهای قوی هم مورد نیاز است، زمان این تابع نسبت به لایک کمتر می باشد. با 7 میلیون رکورد چکش کردم.

با آرزوی موفقیت

maysam.m
یک شنبه 22 مرداد 1391, 23:47 عصر
سلام

بابت فارسی مشکلی نداره.
خوب پشت like و این تابع یک برنامه نویسی دقیق است که کمترین زمان و بیشترین رکورد را ساپورت کنند. که استفاده از like هم آنچنان غیر منطقی نیست چون فقط کوتاه بودن کوئری را نمی شه گفت غیر منطقی.
و برای دیتابیس های بزرگ سخت افزارهای قوی هم مورد نیاز است، زمان این تابع نسبت به لایک کمتر می باشد. با 7 میلیون رکورد چکش کردم.

با آرزوی موفقیت

فکر کنم مزیت این روش استفاده از ایندکس گزاریه . like رو امتحان کردم واقعا بد نتیجه داد و نتایج بی ربط و خیلی زیادی نشون میده . به نظرم علاوه بر این روش اصولی برای جستجوی دقیق هم نمیتونه باشه.
روش "جستجوی فهرست وار متن" رو هنوز امتحان نکردم.
نظرتون درباره روش تگ گذاری چیه؟ یا روش های ابتکاری دیگه کلا؟ چون اشاره کردید: برای دیتابیس های بزرگ سخت افزارهای قوی هم مورد نیاز است

pejman_view
دوشنبه 23 مرداد 1391, 22:45 عصر
سلام

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

اما این روشی که توصیه کردم با CLI دیتابیس MySQL امتحانش کنید بازخورد زمانی آن را به نسبت LIKE امتحان کنید. بنظر من به جواب قابل توجهی می رسید.

موفق باشید.

pooyamakarachi
چهارشنبه 29 شهریور 1391, 13:52 عصر
اگر جدولمون قبلا درست شده باشه میشه بعدا این ویژگی زو بهش اضافه کرد؟؟؟؟؟؟؟؟و آیا با php my admin میشه؟

miladamirzadeh
شنبه 01 مهر 1391, 12:35 عصر
اگر جدولمون قبلا درست شده باشه میشه بعدا این ویژگی زو بهش اضافه کرد؟؟؟؟؟؟؟؟و آیا با php my admin میشه؟
من این طور برداشت کردم که این صرفاً یک کوئریه و نه یه ویژگی. ولی اگر این همون Full Text Search باشه پس میشه یک ویژگی که باید به جدول اضافه شه. درسته؟

pejman_view
دوشنبه 03 مهر 1391, 10:56 صبح
اگر جدولمون قبلا درست شده باشه میشه بعدا این ویژگی زو بهش اضافه کرد؟؟؟؟؟؟؟؟و آیا با php my admin میشه؟




من این طور برداشت کردم که این صرفاً یک کوئریه و نه یه ویژگی. ولی اگر این همون Full Text Search باشه پس میشه یک ویژگی که باید به جدول اضافه شه. درسته؟

سلام

این یک کوئری که فقط در موتور MyISAM قابل استفاده است. و نیاز به تغییر دادن هیچ فیلدی نیست. اگر نمی دانید این موتور چیست، قابل ذکر است بصورت پیشفرض این موتور انتخاب می شود.