ถามเรื่องการ Search เหมือนเว็บนี้หน่อยครับ งมมาทั้งวันยังไม่ได้
สวัสดีครับ พอดีผมเขียนหน้าค้นหา และ ทำ Query ดังนี้
$sql = "SELECT *
FROM products
WHERE p_name like '%$keyword%'
ORDER BY p_id desc";
แต่ไม่ได้ผลครับ ที่อยากได้คือเหมือนอาจารย์ทำเว็บนี้น่ะครับ คือว่า หากเราพิมพ์ Search php mysql แล้ว ผลลัพธ์ที่ออกมาคือจะ Select แยกกันที่เราเคาะ เหมือน Google น่ะครับ คือจากมองเห็นเป็น 3 ข้อความและก็เหมืิอนดังเว็บนี้เลยครับ ไม่ทราบว่าผมต้องเขียน Query ยังไงครับ รบกวนช่วยตอบข้อสงสัยผมด้วยนะครับ ขอบพระคุณครับ
<?php
$keyword = 'php mysql ajax ';
$keywordSQL = '';
$keywordList = array();
$keywordArray = explode(' ', $keyword);
foreach ( $keywordArray AS $val )
{
if ( trim($val) != '')
{
$keywordList[] = " p_name like '%$val%' ";
}
}
if ( count($keywordList) > 0)
{
$keywordSQL = " WHERE ( " . implode(" OR ", $keywordList) . " ) ";
}
$sql = "SELECT *
FROM products
{$keywordSQL}
ORDER BY p_id desc";
echo $sql;
?>
แสดงข้อความที่ค้นพบ
function colorKeyword($keyword, $content)
{
$keywordArray = explode(" ", $keyword);
$colorArray = array('red','green','orange','blue','pink');
$i = 0;
foreach ( $keywordArray as $key => $value)
{
if ( trim( $value ) != "") $content = str_replace($value, "<font color='{$colorArray[$i]}'>" . $value . "</font>", $content);
$i++;
if ( $i >= count($colorArray) ) $i = 0;
}
return $content;
}
อา แม่นแล้วครับ หลักการก็คือ แยกข้อความค้นหา ออกเป็นหลายๆคำ แล้วค้นหาแต่ละคำโดยเชื่อมกันด้วย OR ครับ
แต่ผมจะมีพิเศษนิดนึง อีตรงที่ คำสั้น เช่น or is ผมจะไม่นำมาใช้ในการค้นหาครับ เพราะมันจะได้ผลลัพท์มากเกินไป นอกจากนั้น เทคนิคอื่นๆที่ใช้ก็คือ การจัดอันดับผลลัพท์การค้นหา โดยผลลัพท์ที่ตรงสุดจะแสดงก่อน (คล้ายๆ google) และก็มีการใช้ cache สำหรับการค้นหาในครั้งถัดๆไป เพื่อให้สามารถแสดงผลลัพท์การค้นหา ได้เร็วขึ้น ครับ
เรื่องมันยาว และ อัลกอริทึม มันก็ยังซับซ้อนอยู่ คงยังอธิบายให้เข้าใจในตอนนี้ไม่สะดวก เอาไว้ให้มันชัวร์ๆ ก่อน คงได้เขียนเป็นบทความ
แต่ที่ยากกว่า ผมว่ามันน่าจะเอาไปใช้ยาก เพราะมันออกแบบมาใช้งานเฉพาะกับ GCMS++ เนื่องจากโครงสร้างได้ถูกออกแบบไว้แล้ว ถ้าอยากจะลองดูก็แนะนำให้ประยุกต์เอาตามที่ผมเขียนไปก่อนก็แล้วกัน
1. การจัดอันดับผลการค้นหา หลักการก็คือการ ให้คะแนนผลลัพท์การค้นหา เช่น บทความที่มี ข้อความค้นหา ถูกต้อง 100% ตามข้อความค้นหา ก็ให้คะแนนเต็มไป บทความที่พบข้อความที่สุมบูรณ์มากน้อยต่างกัน ก็ให้คะแนนลดหลั่นกันลงมา (ตอนนี้ยากสุด และใช้เวลาในการประมวลผลนานสุด)
2. เรียงลำดับผลลัพท์ตามคะแนน
3. จากการที่ข้อ 1 ใช้เวลานาน ก็เลยทำ cache ขึ้นมา หลักการก็คือ บันทึกลงเป็นไฟล์ไว่บน server ถ้ามีการค้นหาในหน้าถัดไป ก็ไปเอามาจาก cache หรือ มีใครค้นหาข้อความเดียวกัน ก็สามารถเรียกจาก cache ได้เลย ไม่ต้องค้นหาใหม่