การเขียน Search engine อย่างง่าย

ปรับปรุง : 2548-02-12 ()

บทเรียน ONLINE : การเขียนภาษา PERL
[ การเขียน Search engine อย่างง่าย]
Download แฟ้ม search.dat ไปทำ search engine ส่วนตัวได้ แฟ้มนี้มีมากกว่า 2,000 ระเบียน
การเพิ่ม ลบ แก้ไขในแฟ้มนี้ ทำได้ แต่ไม่มีผลถาวร เพราะผมจะนำข้อมูลมาทับเป็นระยะ หากจะเพิ่ม ให้ไปที่ แนะนำเว็บใหม่

  1. ข้อควรทราบ
  2. การเขียน html ส่ง keyword
  3. โปรแกรม perl ที่ทำหน้าที่ค้นหา และแสดงผล
  4. การเขียน html ส่งค่าเพิ่ม ลบ แก้ไข ข้อมูล
  5. โปรแกรม perl ที่ทำหน้าที่ เพิ่ม ลบ แก้ไขเว็บ
  6. แบบฝึกหัด
ข้อควรทราบ
  1. โปรแกรมนี้ไม่ได้เน้นอะไรมากมาย เพราะเป็นเรื่องง่าย ไม่ซับซ้อน หากท่านศึกษาเรื่องการเพิ่ม ลบ แก้ไข ในบทก่อนหน้านี้มาจนเข้าใจแล้ว ซึ่งแฟ้มที่ใช้มี 5 แฟ้มคือ plsrch1.htm เป็นฟอร์มส่งค่า plsrch1.pl เป็นโปรแกรมรับค่าไปค้นหาและนำมาแสดง plsrch2.htm เป็นฟอร์มส่งความต้องการขอเพิ่มลบหรือแก้ไข และ plsrch2.plจะรับค่ามาประมวลผลเพิ่มทำงานตามคำสั่งต่อไป และ search.dat เป็นแฟ้มข้อมูลที่ท่าน download ไปได้มีระเบียนเตรียมให้สืบค้น 2000 เว็บ แล้วท่านก็นำไปเพิ่มระเบียนจนพอใจได้
  2. ในบทนี้คงเน้นวิธีการเขียน html โดยใช้คำสั่งเปรียบเทียบ if ($getrec[$i] =~ /(.*)$gsys(.*)/) เพื่อเลือกข้อมูลเป็นหลัก เพราะการสืบค้นก็คือการอ่านข้อมูลมาแสดง ส่วนลูกเล่นก็เป็นส่วนปลีกย่อย ที่ท่านสามารถศึกษาเพิ่มเติม และลองผิดลองถูกได้
  3. สิ่งสำคัญอีกประการหนึ่งก็คือ บทนี้มีแฟ้มให้ download (search.dat) ไปปรับปรุงได้ ถึงแม้จะเขียน search engine ดีอย่างไรก็ตาม แต่ถ้าฐานข้อมูลไม่มีอะไร ก็เปล่าประโยชน์ ผมทำข้อมูลไว้ 2000 ระเบียน ท่านสามารถนำไปรวมกับฐานข้อมูลที่ท่านมีอยู่ หรือเพิ่มใหม่จนพอใจได้
  4. สำหรับการเพิ่ม ลบ แก้ไข ที่แยกการทำงาน ขอให้ไปดูจากบทเรียน การปรับปรุงแฟ้มด้วยเลขบรรทัด เพราะเขียนแยกเป็นเรื่อง ๆ ให้เข้าใจแล้ว และบทนี้ต้องการแสดงการรวม เพิ่ม ลบ แก้ไขในเว็บหน้าเดียว และโปรแกรมประมวลผลตัวเดียว เพื่อความกระชับ และต้องการให้นำไปใช้ทำ Search engine ส่วนตัวของท่านได้ จึงรวมโปรแกรมเพิ่ม ลบ แก้ไขเป็นโปรแกรมเดียว
  5. เรื่องเกี่ยวกับ search engine ที่ละเอียดขึ้น จะเขียนเพิ่มในบทต่อไป ..

    โครงสร้างแฟ้ม search.dat ประกอบด้วย
  1. ชื่อเว็บ:ที่อยู่เว็บ:คำอธิบายเว็บ:กลุ่มของเว็บ
  2. name:address:describ:group

การเขียน html ส่ง keyword
โปรแกรมนี้จะสร้าง form สำหรับส่งค่า 1 ค่าคือ keyword ไปให้โปรแกรม plsrch1.pl
จากนั้นเป็นหน้าที่ของ plsrch1.asp ที่ต้องสืบค้นใน search.dat ต่อไป
ตัวอย่างฟอร์ม /perl/plsrch1.htm Source code ของ /perl/plsrch1.htm
คำที่ต้องการค้นหา :

Click เรียกเฉพาะ form นี้ในหน้าต่างใหม่
<body>
<form method=post action=/perl/plsrch1.pl>
คำที่ต้องการค้นหา : <input type=text name=keyword><br>
<input type=submit value=submit>
<input type=reset value="clear it">
</form>
</body>

โปรแกรม perl ที่ทำหน้าที่ค้นหา และแสดงผล
โปรแกรมนี้จะใช้ IF เลือกข้อมูลจาก search.dat ทีละระเบียน
โดยเลือกที่มีค่าจากตัวแปล keyword ที่มีค่าตรงกับในระเบียนใดระเบียนหนึ่ง
หลักการทำงานของโปรแกรมนี้จะทำการสืบค้นโดยอ่านทุกระเบียน มาเปรียบเทียบทีละบรรทัด
ถ้าบรรทัดไหนตรงก็จะ นำระเบียนนั้นไปแสดงผล เพราะตรงตามเงื่อนไขที่ค้นหา
Source code ของ /perl/plsrch1.pl
#!/usr/local/bin/perl
print"Content-type:text/html\n\n";
$filename = join '',"/data1/hm/thaiall.com","/web/search.dat";
print "<html><title>Search result</title>";
print '<body><font face="microsoft sans serif" size=0><pre>';
$gsys = $ENV{"QUERY_STRING"};
$gsys =~ tr/+/ /;
$gsys =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$gsys =~ s/~!/~!/g;
($name, $gsys) = split(/=/, $gsys);
open(myfile,"$filename");
@getrec = <myfile>;
close(myfile);
$cnt =  @getrec;
print "Have data in file search.dat = ", $cnt ,"<br>";
for $i (0 .. $cnt - 1) {
   @getar = split(/:/, $getrec[$i]);
   if ($getrec[$i] =~ /(.*)$gsys(.*)/ ) {		
      print $i," - ",$getar[0]," - ";
      print "<a href=http://" , $getar[1],">http://",$getar[1],"</a> - ";
      print $getar[2],"<br>";	
   }
}
print "</body></html>";

การเขียน html ส่งค่าเพิ่ม ลบ แก้ไข ข้อมูล
ฟอร์มนี้ใช้ในการส่งค่า สำหรับสั่ง เพิ่ม ลบ หรือแก้ไข
ตัวแปรที่สำคัญคือตัวแปรที่ถูก hidden ไว้ตัวแรกที่จะบ่งบอกว่า form นี้มีหน้าที่อะไร
หรือท่านจะนำฟอร์มนี้ไปแยกส่งเป็น แต่ละ html ก็ได้ เพราะการทำงานแยกอิสระอยู่แล้ว
ตัวอย่างฟอร์ม /perl/plsrch2.htm Source code ของ /perl/plsrch2.htm
การเพิ่มเว็บใหม่ ต่อท้ายเว็บสุดท้าย
ชื่อเว็บ :
ที่อยู่เว็บ :
คำอธิบายเว็บ :
กลุ่มของเว็บ :

การลบข้อมูล โดยเลือกจากเลขเว็บ
รหัสเว็บที่ต้องการลบ :

การแก้ไขข้อมูลเว็บ
รหัสเว็บที่ต้องการแก้ไข :
ชื่อเว็บ :
ที่อยู่เว็บ :
คำอธิบายเว็บ :
กลุ่มของเว็บ :

Click เรียกเฉพาะ form นี้ในหน้าต่างใหม่
<body bgcolor=#ffffdd><font face="microsoft sans serif" size=2>
การเพิ่มเว็บใหม่ ต่อท้ายเว็บสุดท้าย
<form method=post action=/perl/plsrch2.pl>
<input type=hidden name=add>
ชื่อเว็บ : <input type=text name=name><br>
ที่อยู่เว็บ : <input type=text name=address><br>
คำอธิบายเว็บ : <input type=text name=describ size=60><br>
กลุ่มของเว็บ : <input type=text name=group><br>
<input type=submit value=submit>
<input type=reset value=reset>
</form>
<hr>
การลบข้อมูล โดยเลือกจากเลขเว็บ
<form method=post action=/perl/plsrch2.pl>
<input type=hidden name=delete>
รหัสเว็บที่ต้องการลบ : <input type=text name=id><br>
<input type=submit value=submit>
<input type=reset value=reset>
</form>
<hr>
การแก้ไขข้อมูลเว็บ
<form method=post action=/perl/plsrch2.pl>
<input type=hidden name=edit>
รหัสเว็บที่ต้องการแก้ไข : <input type=text name=id><br>
ชื่อเว็บ : <input type=text name=name><br>
ที่อยู่เว็บ : <input type=text name=address><br>
คำอธิบายเว็บ : <input type=text name=describ size=60><br>
กลุ่มของเว็บ : <input type=text name=group><br>
<input type=submit value=submit>
<input type=reset value=reset>
</form>
</body>

โปรแกรม perl ที่ทำหน้าที่ เพิ่ม ลบ แก้ไขเว็บ
โปรแกรม perl ตัวนี้จะรวมหน้าที่ทั้งเพิ่ม ลบ และแก้ไข เข้าไว้ด้วยกัน
และผมไม่ได้พยายามเขียนให้สมบูรณ์ แต่เขียนให้ดูง่าย ท่านจะได้นำไปปรับปรุงแก้ไขได้ง่าย ๆ
การทำงานของโปรแกรมนี้จะแยก การเพิ่ม ลบ และแก้ไขออกจากกันอย่างชัดเจน โดยใช้เลขบรรทัดเป็น key หลัก
การลบข้อมูลเลขบรรทัดจะเลื่อนขึ้น บางท่านอาจคิดว่าผมเขียนผิด หรือประมวลผลผิด แต่ถ้าดู ดี ๆ ก็จะเข้าใจครับ
การเพิ่มระเบียนใหม่ไม่มีอะไรมาก เพียงแต่นำระเบียนใหม่ไปต่อท้ายระเบียนสุดท้ายเท่านั้นเอง
Source code ของ /perl/plsrch2.pl
#!/usr/local/bin/perl
$getdata = $ENV{"QUERY_STRING"};
@getrec = split /&/,$getdata;
($vtype,$n) = split /=/,$getrec[0];
($n,$var1) = split /=/,$getrec[1];
($n,$var2) = split /=/,$getrec[2];
($n,$var3) = split /=/,$getrec[3];
($n,$var4) = split /=/,$getrec[4];
($n,$var5) = split /=/,$getrec[5];
print"Content-type:text/html\n\n";
$filename = join '',"/data1/hm/thaiall.com","/web/search.dat";
print "<pre>";
open(myfile,"$filename");
@getrec = <myfile>;
close(myfile);
$cntrec = @getrec;
if ($vtype eq "add") {
   unlink("$filename");
   open(myfile,">$filename");
   for $i (0 .. $cntrec-1) {
      print myfile $getrec[$i];
   }
   $rec = join ":",$var1,$var2,$var3,$var4;
   print myfile $rec,"\n";
}
if ($vtype eq "delete") {
   unlink("$filename");
   open(myfile,">$filename");
   for $i (0 .. $cntrec-1) {
      if ($var1 ne $i) { print myfile $getrec[$i]; }
   }
}
if ($vtype eq "edit") {
   unlink("$filename");
   open(myfile,">$filename");
   for $i (0 .. $cntrec-1) {
      if ($var1 eq $i) {
         $rec = join ":",$var2,$var3,$var4,$var5;
         print myfile $rec,"\n";} else {
         print myfile $getrec[$i];
      }
   }
}
close(myfile);
print $vtype," ok";

แบบฝึกหัด
    ให้ทำตามโจทย์ต่อไปนี้
  1. ให้ copy แฟ้ม /web/search.dat ไปใช้เป็นฐานข้อมูลของท่าน และทำตามตัวอย่างนี้
  2. ปรับปรุงการแสดงผลของตัวอย่างนี้ ให้ดีขึ้น เช่นเพิ่มสี ปรับคำอธิบาย เป็นต้น
  3. ให้สร้างส่วนเพิ่ม ลบ แก้ไข แฟ้ม search.dat โดยดูจากบทเรียนก่อนหน้านี้
ผู้สนับสนุน + ผู้สนับสนุน
+ รับผู้สนับสนุน

แนะนำเว็บใหม่ : ผลการจัดอันดับ
รักลำปาง : thcity.com : korattown.com : topsiam.com : มหาวิทยาลัยโยนก
ศูนย์สอบ : รวมบทความ : ไอทีในชีวิตประจำวัน : ดาวน์โหลด : yourname@thaiall.com
ติดต่อ ทีมงาน ชาวลำปาง มีฝันเพื่อการศึกษา Tel.08-1992-7223