PDA

View Full Version : سوال: موتور جستجوگر



ravand
جمعه 14 بهمن 1390, 08:22 صبح
سلام.
اگه ميشه يه نفر در مورد الگوريتم ساخت يه موتور جستجوگر ساده برام توضيح بده. نميخوام كسي بياد اسكريپتش رو بهم بده ميخوام فقط طريقه ي ساختش و اينكه از چه توابعي ميتونم براي ساختش استفاده كنم منو راهنمايي كنه.
متشكرم.

Reza1607
جمعه 14 بهمن 1390, 11:20 صبح
اين لينك رو يك نگاه بكنيد به نظرم اون چيزي هست كه شما مي خواين
http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html

ravand
جمعه 14 بهمن 1390, 14:35 عصر
راستش در اين مورد مطالب زيادي توي نت هست حتي فارسي. ولي دوست دارم اگه ميشه يه نفر توضيحات رو در اين مورد بگه.
ميشه يه راهنمايي حداقل كوتاه در مورد اين موضوع بكنيد.
متشكرم.

Reza1607
جمعه 14 بهمن 1390, 15:09 عصر
اگه اشتباه نكنم شما مي خواين كه يك فيلدي قرار بدين كه كاربر با وراد كردن كليد واژه هاي خودش داخل اون شما بتونيد داخل بانكتون نتايج مشابه با اون رو بياريد(يه چيزي مثل گوگل)
كاري كه شما مي كنيد اينه كه يك فيلد ميزاريد كه كاربر بتونه كليد واژه خودشو وارد كنه بعد از زدن دكمه جستجو كاري كه شما مي كنيد اينه كه مقدار اين فيلد رو با استفاده از كوئري زير داخل بانكتون جستجو كنيد

SELECT * FROM articles WHERE MATCH (title,body)
AGAINST ('user keyword' IN BOOLEAN MODE);


كه شما بايد به جاي user keyword همون مقدار فيلد رو بذارين

كار خيلي ساده هست.

چند نكته در باره اين دستور

جايي كه كلمات title,body نوشته شده نام فيلد هاتون هست كه مي خواين داخل اين فيلد ها رو به دنبال كليد واژه بگردين پس شما بايد اين قسمت رو مطابق اسم فيلد هاي خودتون تغييرش بدين
اين كوئري از عملگرهاي + , - و ... پشتيباني مي كنه (دقيقا مثل گوگل)

ravand
جمعه 14 بهمن 1390, 15:45 عصر
الان ما دو تا فيلد توي ديتابيس داريم با نام هاي title,body كه ميخوايم در اين فيلد هاي عمليات جستجو انجام بشه. و user keyword هم مقداري رو كه بهش ميديم رو توي اين دو تا فيلد title,body جستجو ميكنه. يعني ما الان حتما بايد توي ديتابيس و جدول فيلدي به نام user keyword بسازيم؟
متشكرم.

Reza1607
جمعه 14 بهمن 1390, 16:08 عصر
نه
شما به طور مثال يك جدول دارين به نام posts كه داخل اين جدول اطلاعاتي مثل عنوان ، متن كامل پست ، چكيده اي ، تگ و ... داخلش دارين حالا مي خواين به طور مثال يك كاربر همچين چيزي رو مي خواد جستجو كنه
منابع كنكور +كارشناسي -كارداني
(اين همون user keyword هستش)
و شما مي خواين اين عبارت رو داخل جدول posts و داخل فيلدهاي عنوان و تگ و متن بگردين كوئري تون به اين صورت ميشه


SELECT * FROM articles WHERE MATCH (`subject`,`tags`,`post`)
AGAINST ('منابع كنكور +كارشناسي -كارداني ' IN BOOLEAN MODE);


كه در اين مثالي كه من زدم
subject همون عنوان و tags تگ و post هم متن كامل هست

Reza1607
جمعه 14 بهمن 1390, 23:35 عصر
سلام دوستان من اين نمونه كد رو نوشتم
اميدوارم مفيد باشه

ravand
چهارشنبه 17 اسفند 1390, 09:22 صبح
من جستجوگر شما رو ساختم ولي نميدونم چرا اين پيغام خطا رو ميده :

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in F:\wamp2\wamp\www\search-engine\index.php on line 49

اين پيغام رو براي اين خط ميده:

while($row=mysql_fetch_array($result))
قبلش كار ميكرد تا امدم يه فيلد linki رو به ديتابيس اضافه كردم قاطي كرد.
اين mysql من:
83777
اينم كدهاي جستجوگر:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>جستجو</title>
<link href="style.css" rel="stylesheet" rev="stylesheet"></link>
</head>
<body>
<div align="center">
<img src="aks.jpg" title="جستجو" alt="جستجو">
</div>
<?php
include('jdf.php');
if(isset($_GET['do']) && $_GET['do']=='post' && isset($_GET['id']))
{
include_once('conn.php');
$query='SELECT * FROM posts WHERE id='.$_GET['id'];
$result=mysql_query($query,$conn) or die('Error in Run Query');
$row=mysql_fetch_array($result);
echo '<div class="post">';
echo '<a href="index.php?do=post&id='.$row['id'].'">'.$row['subject'].'</a><br /><br />';
echo $row['body'].'<br /><hr />
<a href="'.$row['linki'].'">'.لينك.'</a>'.'&nbsp;&nbsp;&nbsp;تاريخ ارسال :'.jdate("d/m/Y",strtotime($row["date"]));
echo '</div><br /><a href="index.php">صفحه اصلي</a>';
}
else
{
?>
<div class="searchbar">
<form action="index.php" method="get">
<input id="txt" type="text" name="query" value="<?php echo isset($_GET['query'])?$_GET['query']:''; ?>" />
<br>
<br>
<input type="submit" value="جستجو" id="btn" />
</form>
</div>
<?php
if(isset($_GET['query']))
{
include_once('conn.php');
$keyword=$_GET['query'];
$query='SELECT * FROM posts WHERE MATCH (`subject`,`body`,`tags`,`linki`) AGAINST (\''.$keyword.'\' IN BOOLEAN MODE);';
$result=mysql_query($query,$conn);
echo '<div class="result">';
while($row=mysql_fetch_array($result))
{
echo '<div class="post"><a href="index.php?do=post&id='.$row['id'].'">'.$row['subject'].'</a></div>';
}
echo '</div>';
}
}
?>
</body>
</html>
هر كاري كردم نفهميدم مشكلش چيه؟
متشكرم.

ravand
چهارشنبه 17 اسفند 1390, 16:39 عصر
مشكلش توي لوكال حل شد ولي نميدونم چرا روي هاست كار نميكنه:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>جستجوگر</title>
<link href="style.css" rel="stylesheet" rev="stylesheet"></link>
</head>
<body>
<?php
include('jdf.php');
date_default_timezone_set('Asia/Tehran');
if(isset($_GET['do']) && $_GET['do']=='post' && isset($_GET['id']))
{
include_once('conn.php');
$query='SELECT * FROM posts WHERE id='.$_GET['id'];
$result=mysql_query($query,$conn) or die('Error in Run Query');
$row=mysql_fetch_array($result);
echo '<div class="post">';
echo '<a href="index.php?do=post&id='.$row['id'].'">'.$row['subject'].'</a><br/><br/>';
echo $row['body'].'<br/><hr/>
<a href="'.$row['linki'].'">لينك</a>'.'&nbsp;&nbsp;&nbsp;تاريخ ارسال :
'.jdate("h:i:s d/m/Y",strtotime($row["date"]));
echo '</div><br /><a href="index.php">صفحه اصلي</a>';
}
else
{
?>
<div class="searchbar">
<form action="index.php" method="get">
<input id="txt" type="text" name="query" value="<?php echo isset($_GET['query'])?$_GET['query']:''; ?>" />
<br>
<br>
<input type="submit" value="جستجو" id="btn" />
</form>
</div>
<?php
if(isset($_GET['query']))
{
include_once('conn.php');
$keyword=$_GET['query'];
$query='SELECT * FROM posts WHERE MATCH (`subject`,`body`,`tags`) AGAINST (\''.$keyword.'\' IN BOOLEAN MODE);';
$result=mysql_query($query,$conn);
echo '<div class="result">';
while($row=mysql_fetch_array($result))
{
echo '<div class="post"><a href="index.php?do=post&id='.$row['id'].'">'.$row['subject'].'</a></div>';
}
echo '</div>';
}
}
?>
</body>
</html>

MMSHFE
چهارشنبه 17 اسفند 1390, 19:45 عصر
خطا دریافت میکنید؟ مشکلش چیه؟ با mysql_error خطا رو بررسی کنید تا بهتر بشه راهنمایی کنیم. موفق باشید.

ravand
چهارشنبه 17 اسفند 1390, 21:59 عصر
متشكر مهندس مشكلم حل شد. الان اگه دقت كنيد يه فيلد جديد ساختم براش با عنوان linki كه براي لينك هست . خواستم به select اضافه كنم تا بشه لينك ها رو هم جستجو كرد. ولي نميدونم چرا نشد!

mosi2007
چهارشنبه 17 اسفند 1390, 22:50 عصر
این گوگل یا هر موتور جستجو گری همه چیز ها رو تو دیتابیسش داره که میره از تو اونا جستجو میکنه یا یه جوره دیگه ایست
اگه میشه بگید ؟

ravand
پنج شنبه 18 اسفند 1390, 08:55 صبح
براي اينكه بخواد عمل جستجو انجام بشه ، بالاخره بايد يه سري اطلاعاتي يه جايي وجود داشته باشه . حتما اين اطلاعات توي ديتابيس هست كه توش جستجو ميشه.

mosi2007
پنج شنبه 18 اسفند 1390, 11:26 صبح
براي اينكه بخواد عمل جستجو انجام بشه ، بالاخره بايد يه سري اطلاعاتي يه جايي وجود داشته باشه . حتما اين اطلاعات توي ديتابيس هست كه توش جستجو ميشه.
اخه مگه میشه
من الان مثلا یه تایپیک ایجاد میکنم بعد تو گوگل عین همین کلماتی که تو همین تاپیک تو اینجا ایجاد کردم رو سرچ میکنم یهو گوگل اینم پیدا میکنه یعنی اینو چه جوری پیدا میکنه اینا که تو دیتا بیسش نرفته
و اینکه هر چیزی تو نت است دلیلی نداره که همون چیزا تو دیتابیسش ذخیره بشه

ravand
پنج شنبه 18 اسفند 1390, 11:32 صبح
اخه مگه میشه
من الان مثلا یه تایپیک ایجاد میکنم بعد تو گوگل عین همین کلماتی که تو همین تاپیک تو اینجا ایجاد کردم رو سرچ میکنم یهو گوگل اینم پیدا میکنه یعنی اینو چه جوری پیدا میکنه اینا که تو دیتا بیسش نرفته
و اینکه هر چیزی تو نت است دلیلی نداره که همون چیزا تو دیتابیسش ذخیره بشه


ببين اين سايت برنامه نويس قبلاً به گوگل معرفي شده . براي همين هر وقت مطالب اين سايت به روز ميشه به وسيله ي ابزاري كه گوگل در اختيار داره به طور خودكار شناسايي ميشه . و به بانك اطلاعاتي گوگل اضافه ميشه. شما برو سايت يا وبلاگت رو در اين آدرس ثبت كن ; www.google.com/addurl
البته قبلاً راحت ميتونستي وارد اين ادرس بشي ولي حالا بايد جيميل داشته باشي.

MMSHFE
پنج شنبه 18 اسفند 1390, 11:56 صبح
اخه مگه میشه
من الان مثلا یه تایپیک ایجاد میکنم بعد تو گوگل عین همین کلماتی که تو همین تاپیک تو اینجا ایجاد کردم رو سرچ میکنم یهو گوگل اینم پیدا میکنه یعنی اینو چه جوری پیدا میکنه اینا که تو دیتا بیسش نرفته
و اینکه هر چیزی تو نت است دلیلی نداره که همون چیزا تو دیتابیسش ذخیره بشه
سایتهایی که خوب طراحی شدن، چیزی به اسم نقشه سایت یا sitemap دارن که یک فایل XML هست و توی اون، عنوان صفحات مختلف با لینکشون قرار میگیره. حالا اگه فایلها زیاد بود، فایل XML اصلی میتونه لینک فایلهای XML دیگه رو در بر بگیره تا بتونید براحتی فهرست همه مطالب رو به موتورهای جستجو معرفی کنید. این فایل رو باید به اسم sitemap.xml توی فهرست ریشه سایتتون بگذارین. موتورهای جستجو هم اون فایل رو میخونن. سایتهای پویا هم به محض تغییر یا ایجاد مبحث جدید، فایل sitemap خودشون رو اصلاح میکنن. اینطوری میشه که موتور جستجو مطالب جدید رو فوراً پیدا میکنه. برای آشنایی با نحوه ایجاد sitemap همین عبارت رو جستجو کنید. موفق باشید.

ravand
پنج شنبه 18 اسفند 1390, 13:11 عصر
نقشه ي سايت رو ميتوني با اين سايت هم بسازي كافيه آدرس سايتت رو بهش بدي:http://www.xml-sitemaps.com

ravand
شنبه 20 اسفند 1390, 17:07 عصر
من الان دو تا مشكل دارم كه نتونستم بر طرفش كنم.
يكي اينكه اين اسكريپت وقتي چيزي توي ديتابيس نباشه مثلاً پيغام نميده نتيجه اي در بر نداشت. دوم اينكه توي لينك سرچ نميكنه.
متشكرم.

رضا قربانی
یک شنبه 21 اسفند 1390, 13:02 عصر
این گوگل یا هر موتور جستجو گری همه چیز ها رو تو دیتابیسش داره که میره از تو اونا جستجو میکنه یا یه جوره دیگه ایست
اگه میشه بگید ؟
بله . همه چیز رو در دیتابیس داره.

الان گوگل واسه خودش یک نوع برنامه نویسی شده ، البته در مبحث سئو

شنیدم گوگل داره یک لغت می شه همون به معنای SEARCH

مثلا علی برو توی لباسا گوگل کن :لبخند:
Google=Search

mosi2007
یک شنبه 21 اسفند 1390, 18:26 عصر
بله . همه چیز رو در دیتابیس داره.

الان گوگل واسه خودش یک نوع برنامه نویسی شده ، البته در مبحث سئو

شنیدم گوگل داره یک لغت می شه همون به معنای SEARCH

مثلا علی برو توی لباسا گوگل کن :لبخند:
Google=Search
دمت گرم با این ضرب المثلت:قهقهه::کف::لبخند::تشو ق::لبخندساده:

Reza1607
دوشنبه 22 اسفند 1390, 00:23 صبح
من الان دو تا مشكل دارم كه نتونستم بر طرفش كنم.
يكي اينكه اين اسكريپت وقتي چيزي توي ديتابيس نباشه مثلاً پيغام نميده نتيجه اي در بر نداشت. دوم اينكه توي لينك سرچ نميكنه.
متشكرم.

من اين دو مشكل رو حل كردم و البته اون رو تست كردم
اميدوارم مشكلتون حل بشه

ravand
سه شنبه 23 اسفند 1390, 21:17 عصر
ببخشيد ولي كد شما رو تست كردم كار نكرد. سعي كردم مشكلش رو حل كنم نشد:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in F:\wamp\wamp\www\search3\index.php on line 41

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in F:\wamp\wamp\www\search3\index.php on line 42

از اين دو خط خطا ميگيره:

if(mysql_num_rows($result)===0) echo '<div style="margin:0 auto">هيچ موردي يافت نشد</div>';
else while($row=mysql_fetch_array($result)) echo '<div class="post"><a href="index.php?do=post&id='.$row['id'].'">'.$row['subject'].'</a></div>';

Reza1607
سه شنبه 23 اسفند 1390, 21:24 عصر
ميشه قبل از اين دستور كوئري رو بذارين
شما فايل بانك رو هم ايمپورت كردين؟

ravand
سه شنبه 23 اسفند 1390, 21:31 عصر
اينا همه اش فايلي هست كه شما داديد :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Googooli</title>
<link href="style.css" rel="stylesheet" rev="stylesheet"></link>

</head>

<body>
<?php
if(isset($_GET['do']) && $_GET['do']=='post' && isset($_GET['id']))
{
include_once('conn.php');
$query='SELECT * FROM posts WHERE id='.$_GET['id'];
$result=mysql_query($query,$conn) or die('Error in Run Query');
$row=mysql_fetch_array($result);
echo '<div class="post">';
echo '<a href="index.php?do=post&id='.$row['id'].'">'.$row['subject'].'</a><br /><br />';
echo $row['body'].'<br /><hr />نويسنده : '.$row['author'].'&nbsp;&nbsp;&nbsp;تاريخ ارسال : '.date('Y-m-d H:m:s',$row['date']);
echo '</div><br /><a href="index.php">صفحه اصلي</a>';
}
else
{
?>
<div class="searchbar">
<form action="index.php" method="get">
<input id="txt" type="text" name="query" value="<?php echo isset($_GET['query'])?$_GET['query']:''; ?>" /><input type="submit" value="Go !" id="btn" />
</form>
</div>
<hr />
<?php
if(isset($_GET['query']))
{
include_once('conn.php');
$keyword=$_GET['query'];
$query='SELECT * FROM posts WHERE MATCH (`subject`,`body`,`tags`,`linki`) AGAINST (\''.$keyword.'\' IN BOOLEAN MODE);';
$result=mysql_query($query,$conn);
echo '<div class="result">';
if(mysql_num_rows($result)===0) echo '<div style="margin:0 auto">هيچ موردي يافت نشد</div>';
else while($row=mysql_fetch_array($result)) echo '<div class="post"><a href="index.php?do=post&id='.$row['id'].'">'.$row['subject'].'</a></div>';
echo '</div>';
}
}
?>
</body>
</html>
منظورتون از فايل بانك فايل sql هست؟

ravand
سه شنبه 23 اسفند 1390, 23:41 عصر
اين مشكلش حل شد.
ولي يادم رفت يه چيز ديگه رو هم بگم:
اينكه وقتي توش يه مطلبي رو جستجو ميكني مثلاً اگه براي اون جستجو 50 تا پست نتيجه پيدا بشه 50 تا پست رو توي يه صفحه نشون ميده . در صورتي كه بايد چند صفحه باشه مثل وقتي كه توي گوگل سرچ ميزني يا مثل همين تاپيك كه شماره ي صفحات 1 2 3 4 بوجود مياد.
متشكرم.

Reza1607
سه شنبه 23 اسفند 1390, 23:54 عصر
دوست عزيز من 5 دقيقه اي يه نمونه نوشتم براي اين كه متوجه روش استفاده از اين دستور بشين

ravand
چهارشنبه 24 اسفند 1390, 10:54 صبح
ببخشيد من منظوري نداشتم.
فقط ميخواستم بدونم چطوري ميتونم اين كار رو انجام بدم.
ممنون ميشم راهنمايي كنيد.
متشكرم.

Reza1607
چهارشنبه 24 اسفند 1390, 16:50 عصر
منظور خاصي نداشتم فقط مي خواستم بدونيد كه زياد روش وقت نذاشتم
با استفاده از limit دنبال paging بگردين

ravand
یک شنبه 28 اسفند 1390, 17:57 عصر
در موردش تحقيق كردم و اينطوري نوشته بود:

$start = $page ;
$perpage = 10;
$query=mysql_query("SELECT * FROM question ORDER BY `id` DESC limit $start, $perpage");
بايد با حلقه ي for اول و آخرش رو تعيين كنم.
حالا نميدونم چجوري توي كد خودم ازش استفاده كنم. يعني يه بار بايد براي مشخص كردم اول و آخر بايد سلكت كنم و يه بار براي جستجو.
موندم چيكار كنم.
متشكرم

Reza1607
یک شنبه 28 اسفند 1390, 19:40 عصر
راستش من هم براي اين كه مشخص بشه كه نتايج چند صفحه است بايد چي كار كنم ( يعني به غير از اين كه يكبار يك سلكت براي تمام نتايج و يك سكلت براي بخشي از نتايج بگيريم روش ديگه اي رو بلد نيستم)

اون كدي هم كه دادي يك مشل داره
اين خط رو بايد


$start = $page ;

به اين صورت بنويسيد


$start = ($page-1)*10 ;

و يا خط سوم رو به اين صورت بنويسيد


$query=mysql_query("SELECT * FROM question ORDER BY `id` DESC limit $start offset $perpage");