GORAGOD.com

freelance, web developer, web designer, hosting, domain name

ถามเรื่องการ Search เหมือนเว็บนี้หน่อยครับ งมมาทั้งวันยังไม่ได้


สวัสดีครับ พอดีผมเขียนหน้าค้นหา และ ทำ Query ดังนี้

                $sql = "SELECT *
                FROM products
                WHERE p_name like '%$keyword%'
                ORDER BY p_id desc";

  แต่ไม่ได้ผลครับ ที่อยากได้คือเหมือนอาจารย์ทำเว็บนี้น่ะครับ คือว่า หากเราพิมพ์ Search php mysql แล้ว ผลลัพธ์ที่ออกมาคือจะ Select แยกกันที่เราเคาะ เหมือน Google น่ะครับ คือจากมองเห็นเป็น 3 ข้อความและก็เหมืิอนดังเว็บนี้เลยครับ ไม่ทราบว่าผมต้องเขียน Query ยังไงครับ รบกวนช่วยตอบข้อสงสัยผมด้วยนะครับ ขอบพระคุณครับ
30 มิ.ย. 2552 7 2,679

ผมคิดว่า คล้ายๆ แบบนี้นะ


<?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;
?>
#1

ส่วนอันนี้ การทำสี

แสดงข้อความที่ค้นพบ


    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;
    }
#2

อา แม่นแล้วครับ หลักการก็คือ แยกข้อความค้นหา ออกเป็นหลายๆคำ แล้วค้นหาแต่ละคำโดยเชื่อมกันด้วย OR ครับ

แต่ผมจะมีพิเศษนิดนึง อีตรงที่ คำสั้น เช่น or is ผมจะไม่นำมาใช้ในการค้นหาครับ เพราะมันจะได้ผลลัพท์มากเกินไป นอกจากนั้น เทคนิคอื่นๆที่ใช้ก็คือ การจัดอันดับผลลัพท์การค้นหา โดยผลลัพท์ที่ตรงสุดจะแสดงก่อน (คล้ายๆ google) และก็มีการใช้ cache สำหรับการค้นหาในครั้งถัดๆไป เพื่อให้สามารถแสดงผลลัพท์การค้นหา ได้เร็วขึ้น ครับ

#3

อยากรู้ด้วยครับว่า ทำงัยอะพี่ อิอิ
#4

555+++

เรื่องมันยาว และ อัลกอริทึม มันก็ยังซับซ้อนอยู่ คงยังอธิบายให้เข้าใจในตอนนี้ไม่สะดวก เอาไว้ให้มันชัวร์ๆ ก่อน คงได้เขียนเป็นบทความ

แต่ที่ยากกว่า ผมว่ามันน่าจะเอาไปใช้ยาก เพราะมันออกแบบมาใช้งานเฉพาะกับ GCMS++ เนื่องจากโครงสร้างได้ถูกออกแบบไว้แล้ว ถ้าอยากจะลองดูก็แนะนำให้ประยุกต์เอาตามที่ผมเขียนไปก่อนก็แล้วกัน

1. การจัดอันดับผลการค้นหา หลักการก็คือการ ให้คะแนนผลลัพท์การค้นหา เช่น บทความที่มี ข้อความค้นหา ถูกต้อง 100% ตามข้อความค้นหา ก็ให้คะแนนเต็มไป บทความที่พบข้อความที่สุมบูรณ์มากน้อยต่างกัน ก็ให้คะแนนลดหลั่นกันลงมา (ตอนนี้ยากสุด และใช้เวลาในการประมวลผลนานสุด)
2. เรียงลำดับผลลัพท์ตามคะแนน
3. จากการที่ข้อ 1 ใช้เวลานาน ก็เลยทำ cache ขึ้นมา หลักการก็คือ บันทึกลงเป็นไฟล์ไว่บน server ถ้ามีการค้นหาในหน้าถัดไป ก็ไปเอามาจาก cache หรือ มีใครค้นหาข้อความเดียวกัน ก็สามารถเรียกจาก cache ได้เลย ไม่ต้องค้นหาใหม่
#5

ขอบคุณมากครับผม
#6

ต้องการ อัลกอริทึม แบบนี้พอดีเลย ทำไงถึงจะได้มาศึกษา
#7
ความคิดเห็น
ไฟล์อัปโหลด ชนิด jpg, jpeg ขนาดไฟล์ไม่เกิน 2M
^