รบกวนผู้รู้หน่อยครับ ต้องการให้อธิบายเงื่อนไขของ full-text search ครับอ่านแล้วงงงมาก

เริ่มโดย wHitehAcker, 18 มีนาคม 2011, 21:41:18

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

wHitehAcker

คือผมต้องการ query ข้อมูลจากสองฟิวครับคือ ฟิว content and tag1 ด้วยคำว่า โดม+ปกรณ์+ลัม แล้วให้โชว์ข้อมูลออกมา ตอนนี้ผมใช้คำสั่ง

select * from news where match(content,tag1) against('โดม+ปกรณ์+ลัม'); อยู่ครับ แต่ลองใช้คำสั่ง sql ใน mysql แล้วขึ้น error แบบนี้ครับ

Can't find FULLTEXT index matching the column list 

จากข้อมูลข้างต้น คือผมจะทำระบบ tags เหมือนใน sanook อะครับคือคลิกลิ้งค์แล้ว ให้ค้นหาคำที่ตรงกะลิงค์อะครับ

thongtae

หมายถึงพวกคำฮิต และคำค้นยอดฮิตน่ะหรือ ก็แค่ทำการส่งพารามิเตอร์ไปกับ คำสั่งGET หรือ POST ให้กับหน้า SEARCH.phpไม่ใช่เหรอ
อย่างเช่นคำว่า "รถมือสอง"
http://dir.sanook.com/result-search.php?q=รถมือสอง?utm_source=Sanook&utm_medium=HitDir&utm_content=รถมือสอง&utm_campaign=Keyword

ถ้าเข้าใจผิดก็ขออภัยนะครับ :wanwan017:

panuunap

ใช่แบบดังนี้หรือไม่ครับ

ค้นหาแบบส่งค่าตามปกติ Get หรือ Post
<a href="search.php?tag=แมว">แมว</a>

ค้นหาแบบใช้ร่วมกับความสามารถของ RewriteRule ในไฟล์ .htaccess
โดยเขียนเงื่อนไขเอาส่วนหนึ่งของ URL ส่งค่าไปที่ไฟล์ search.php?tag=$1 อีกที
<a href="http://www.aaa.com/tag/แมว">แมว</a>

wHitehAcker

อ้างถึงจาก: panuunap ใน 19 มีนาคม 2011, 00:42:29
ใช่แบบดังนี้หรือไม่ครับ

ค้นหาแบบส่งค่าตามปกติ Get หรือ Post
<a href="search.php?tag=แมว">แมว</a>

ค้นหาแบบใช้ร่วมกับความสามารถของ RewriteRule ในไฟล์ .htaccess
โดยเขียนเงื่อนไขเอาส่วนหนึ่งของ URL ส่งค่าไปที่ไฟล์ search.php?tag=$1 อีกที
<a href="http://www.aaa.com/tag/แมว">แมว</a>

ใช่ครับแต่ปัญหาผมคือ ผม get ไฟล์มาจากอีกไฟล์หนึ่งครับ แต่มันไม่ get ให้ผม ผมต้องแก้อย่างไรครับ :-X

<?php
 
$news_id $_REQUEST['id'];
    
$sql "select * from news where news_id =" .$_REQUEST['id'];
$qry mysql_query($sql) or die ("Error Query [".$sql."]");
$row mysql_fetch_array($qry);
 ?>

     <table style="color:black; background-color:lemonchiffon;" align="center" width="500" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td height="28" colspan="3" align="center" valign="middle" style="font-size:15pt" bgcolor="#00B75B"><?=$row['title']?>
   
    </td>
  </tr>
  <tr>
    <td height="57" colspan="3" valign="top"><div align="center">
      <p><img width="150px" height="120px"  src="<?php echo "backoffice/logonews/".$row['image_logo']?>" /></p>
</div>
      <p><div class="contentnews">&nbsp;&nbsp;&nbsp;&nbsp;<?=$row['content']?></div></p></td>
  </tr>
  <tr>
    <td width="292" height="19"  align="center" valign="top" bgcolor="#00B75B">เขียนเมื่อ : <?=showdate($row["date_news"])?></td>
    <td align="center" width="89" bgcolor="#00B75B" >ผู้ชม : <?=$row["num_view"]?></td>
    <td  align="center" width="119" bgcolor="#00B75B">ความคิดเห็น : <?=$row["num_comment"]?></td>
  </tr>
  <tr>
    <td colspan="3" valign="top"><form method="get" action="$PHP_SELF">tag :
    <?php

if(!empty($row["tag1"]))

?>

    <a href="tags.php?tags="<?=$row["tag1"];?>" target="_blank"> <?=$row["tag1"]?> </a>
    <?php
    
}

?>

ball6847

ถ้าทำถูกยังงัยก็ส่งค่าไปได้ ถ้า tag ยังไม่ได้ encode ให้ urlencode ก่อนนะ urlencode($row["tag1"])
We use Ubuntu.

[direct=http://ng-seo.sourcelab.xyz/]AngularJS SEO Experimental[/direct]

wHitehAcker

ตอนนี้ผม get ค่า tags=โดม ปกรณ์ ลัม แล้วก็แปลง url เป็น โดม-ปกรณ์-ลัม ได้แล้วครับ แล้วผมต้องเขียน code sql ยังไงเพื่อ query ให้โชว์ค่าครับ ตอนนี้ผมเขียน
sql ดังนี้ครับ

$sql = "select * from news where content REGEXP '[[:<:]]".$tags."[[:>:]]' ";


รบกวนทีครับ ผมมือใหม่ :wanwan017:

thongtae

ส่งค่าพารามิเตอร์ไปให้ไฟล์ SEARCH.php เลยครับ
ไม่มีไฟล์ SEARCH.php หรือครับ
แล้วคำสั่งใน search.php จะจัดการให้ครับ

หรือว่ายังไม่มีก็ต้องเขียนขึ้นมาก่อนครับ

wHitehAcker

อ้างถึงจาก: ball6847 ใน 19 มีนาคม 2011, 01:59:14
ถ้าทำถูกยังงัยก็ส่งค่าไปได้ ถ้า tag ยังไม่ได้ encode ให้ urlencode ก่อนนะ urlencode($row["tag1"])

สวดยอดไปเลยครับบ  :wanwan017: แต่ตอนนี้เหมือนกับว่ามัน search ทุกคำใช่ไหมครับคือ โดม+ปกรณ์+ลัม ประมาณว่าจะโชว์ข้อมูลก็ต่อเมื่อ content นั้นต้องมีทั้งสามคำ แล้วมีวิธีไหนครับถ้าผมจะให้มัน มีแค่คำเดียวก็โชว์ค่าออกมาเลยอ่ะครับ อย่างเช่น มีคำว่า โดม อะไรประมาณนี้ครับ  :wanwan011:

wHitehAcker

อ้างถึงจาก: thongtae ใน 19 มีนาคม 2011, 02:19:39
ส่งค่าพารามิเตอร์ไปให้ไฟล์ SEARCH.php เลยครับ
ไม่มีไฟล์ SEARCH.php หรือครับ
แล้วคำสั่งใน search.php จะจัดการให้ครับ

หรือว่ายังไม่มีก็ต้องเขียนขึ้นมาก่อนครับ


คือผมไม่ได้ ค้นหาจาก form อ่ะครับ ผมกด ลิงค์แล้ว get ค่า จากนั้น ให้ค้นหาเลยครับ

thongtae

เข้าใจผิดแล้วครับ ฟอร์มมันเป็นแค่หน้ากากสำหรับรับค่าอินพุตเท่านั้นครับซึ่งก็คือส่งค่านั้นไปที่พารามิเตอร์ของไฟล์search.php
ส่วนไฟล์search.php จะรับค่าอาร์กิวเมนท์มาที่พารามิเตอร์ที่มันมีครับ

wHitehAcker

อ้างถึงจาก: thongtae ใน 19 มีนาคม 2011, 02:39:07
เข้าใจผิดแล้วครับ ฟอร์มมันเป็นแค่หน้ากากสำหรับรับค่าอินพุตเท่านั้นครับซึ่งก็คือส่งค่านั้นไปที่พารามิเตอร์ของไฟล์search.php
ส่วนไฟล์search.php จะรับค่าอาร์กิวเมนท์มาที่พารามิเตอร์ที่มันมีครับ


อ่อผมสร้างเป็นไฟล์ tags ครับ ตอนนี้ get ได้ quey ได้ แต่ตอนนี้เหมือนกับว่ามัน search ทุกคำคือ โดม+ปกรณ์+ลัม ประมาณว่าจะโชว์ข้อมูลก็ต่อเมื่อ content(field ที่ผม select ใน database ข้างต้น นั้นต้องมีทั้งสามคำ แล้วมีวิธีไหนครับถ้าผมจะให้มัน มีแค่คำเดียวก็โชว์ค่าออกมาเลยอ่ะครับ อย่างเช่น มีคำว่า โดม อะไรประมาณนี้ครับ

หรือ ถ้าผมจะ select ข้อมูลจาก 2 field เลยประมาณว่า ให้ไป select ทั้ง field [content] และก็ field [tag] ด้วย ต้องใช้คำสั่ง sql ว่าอะไรครับ :wanwan044:

ball6847

ถ้าอยากได้แบบนั้นคงต้องใช้ FULLTEXT search ครับ ผมเองก็ทำไม่บ่อย อธิบายเด๋วจะพามั่วเปล่าๆ
แต่คร่าวๆคือต้องไป ทำ index ของ column ที่จะใช้ค้นให้เป็นแบบ fulltext ใช้ได้กับเฉพาะแบบ CHAR VARCHAR แล้วก็ TEXT ส่วน คำสั่ง ดูจากลิ้งค์ข้างล่างหรือไปกุเกิ้ลเอาคับ

reference ของ mysql คับ
http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

ลองค้น google ว่า mysql fulltext search คับ อาจช่วยได้
We use Ubuntu.

[direct=http://ng-seo.sourcelab.xyz/]AngularJS SEO Experimental[/direct]

wHitehAcker

อ้างถึงจาก: ball6847 ใน 19 มีนาคม 2011, 03:26:06
ถ้าอยากได้แบบนั้นคงต้องใช้ FULLTEXT search ครับ ผมเองก็ทำไม่บ่อย อธิบายเด๋วจะพามั่วเปล่าๆ
แต่คร่าวๆคือต้องไป ทำ index ของ column ที่จะใช้ค้นให้เป็นแบบ fulltext ใช้ได้กับเฉพาะแบบ CHAR VARCHAR แล้วก็ TEXT ส่วน คำสั่ง ดูจากลิ้งค์ข้างล่างหรือไปกุเกิ้ลเอาคับ

reference ของ mysql คับ
http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

ลองค้น google ว่า mysql fulltext search คับ อาจช่วยได้

ขอบคุณมากเลยครับที่ให้แนวคิด และแนะแนวทาง  แต่ตอนนี้ผมอ่าน manual แล้วงงมากเลยครับ ต้องส่งงานวันนี้ด้วยยังไงรบกวน พี่ ball อธิบายมาแบบในพี่เข้าใจก็ได้ครับเผื่อจะเป็นแนวทางให้ผมได้บ้าง  :wanwan017:

kluykub

อ้างถึงจาก: wHitehAcker ใน 19 มีนาคม 2011, 03:04:03
หรือ ถ้าผมจะ select ข้อมูลจาก 2 field เลยประมาณว่า ให้ไป select ทั้ง field [content] และก็ field [tag] ด้วย ต้องใช้คำสั่ง sql ว่าอะไรครับ :wanwan044:
select content,tag from tablename;

kluykub

ส่วนการค้นหา ทำไมไม่เอา tag มา split เอาเครื่องหมายบวกออกก่อนแล้วจะได้ array ซึ่งเก็บคำไว้อยู่
แล้วค่อยวน loop สร้างคำสั่ง sql เอาครับ
เช่น
อ้างถึง
<?php
$tag="โดม+ปกรณ์+ลัมภ์";
$artag=explode("+", $tag);
$sql="select content,tag from news where";
for($i=0;$i<count($artag);$i++)
{
   if($i==0)
   {
      $sql=$sql." tag like '%$artag[$i]%' or content like '%$artag[$i]%'";
   }
   else
   {
      $sql=$sql." or tag like '%$artag[$i]%' or content like '%$artag[$i]%'";
   }
}
echo $sql;
?>

ผลลัพท์
อ้างถึง
select content,tag from news where tag like '%โดม%' or content like '%โดม%' or tag like '%ปกรณ์%' or content like '%ปกรณ์%' or tag like '%ลัมภ์%' or content like '%ลัมภ์%'

wHitehAcker

อ้างถึงจาก: kluykub ใน 19 มีนาคม 2011, 11:11:33
ส่วนการค้นหา ทำไมไม่เอา tag มา split เอาเครื่องหมายบวกออกก่อนแล้วจะได้ array ซึ่งเก็บคำไว้อยู่
แล้วค่อยวน loop สร้างคำสั่ง sql เอาครับ
เช่น
อ้างถึง
<?php
$tag="โดม+ปกรณ์+ลัมภ์";
$artag=explode("+", $tag);
$sql="select content,tag from news where";
for($i=0;$i<count($artag);$i++)
{
   if($i==0)
   {
      $sql=$sql." tag like '%$artag[$i]%' or content like '%$artag[$i]%'";
   }
   else
   {
      $sql=$sql." or tag like '%$artag[$i]%' or content like '%$artag[$i]%'";
   }
}
echo $sql;
?>

ผลลัพท์
อ้างถึง
select content,tag from news where tag like '%โดม%' or content like '%โดม%' or tag like '%ปกรณ์%' or content like '%ปกรณ์%' or tag like '%ลัมภ์%' or content like '%ลัมภ์%'

สุดยอดเลยครับขอบพระคุณมากครับ  :wanwan017:

wHitehAcker

ตอนนี้ผมใช้คำสั่ง full text search ได้แล้วครับด้วยคำสั่ง

$sql = "select * from news where match(content,tag1) against('โดม+ปกรณ์+ลัม' in boolean mode);";  >>> คือต้องใส่ คำว่า in boolean mode ด้วย  :P
:wanwan017: :wanwan017: :wanwan017: ขอบคุณทุกท่านที่ให้ความช่วยเหลือครับ

Tee++;

Fulltext ของ MySQL มันโครตห่วยเลยนะครับ มันตัดคำภาษาไทยเพี้ยนโครตๆ ค้นหาก็มั่วๆ ผลลัพธ์ก็แปลกๆ 555+

เพราะว่าตัวอัลกอลิทึ่มมันเป็นแบบนี้ http://en.wikipedia.org/wiki/N-gram

เรื่อง Performance นี่ยิ่งแล้วใหญ่ ไม่ได้ว่านะครับ แต่มันเรื่องจริงอ่ะ T___T

ส่วนของ S! ใช้ http://lucene.apache.org/solr/ ตัวนี้ครับ เป็นตัวทำ index กับ search

ส่วนตัวตัดคำนี่ไม่แน่ใจ อาจจะเป็น http://linux.thai.net/projects/libthai ก็ได้ ไม่รู้จริงๆ

ผมมีเขียนเรื่อง Full text search ไว้นะ ลองดู
http://www.jquerytips.com/blogs/view/1319/%E0%B8%A1%E0%B8%B2%E0%B8%97%E0%B8%B3-Full-Text-Serach-%E0%B8%81%E0%B8%B1%E0%B8%99%E0%B8%81%E0%B8%B1%E0%B8%9A-Zend-Search
[direct=http://laravel.in.th]Laravel in Thai[/direct]
[direct=http://jquerytips.com]jQueryTips by Tee++;[/direct]
[direct=https://www.facebook.com/jQueryTips]jQueryTips Page[/direct]
[direct=https://www.facebook.com/Laravel.in.th]Laravel in Thai Page[/direct]
[direct=https://twitter.com/Teepluss]Teepluss's Twitter[/direct]


bonshington

ของ swatch แกะ dic ดูแล้ว เอามาจาก dic ราชบัณฑิต คำไทยแท้ๆ แต่ถ้าเจอพวกภาษาวัยรุ่น มีหวังเจ๊ง

Tee++;

อ้างถึงจาก: bonshington ใน 22 มีนาคม 2011, 12:12:45
ของ swatch แกะ dic ดูแล้ว เอามาจาก dic ราชบัณฑิต คำไทยแท้ๆ แต่ถ้าเจอพวกภาษาวัยรุ่น มีหวังเจ๊ง

เวอร์ชั่นใหม่ มันเพิ่ม ศัพท์เองได้นะครับ แต่คงเพิ่มกันเยอะเลย 555
[direct=http://laravel.in.th]Laravel in Thai[/direct]
[direct=http://jquerytips.com]jQueryTips by Tee++;[/direct]
[direct=https://www.facebook.com/jQueryTips]jQueryTips Page[/direct]
[direct=https://www.facebook.com/Laravel.in.th]Laravel in Thai Page[/direct]
[direct=https://twitter.com/Teepluss]Teepluss's Twitter[/direct]