banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows Thiết kế Website tìm kiếm  XML
  [Programming]   Thiết kế Website tìm kiếm 19/12/2007 13:26:50 (+0700) | #1 | 104730
jupiter29186
Member

[Minus]    0    [Plus]
Joined: 17/12/2005 12:31:58
Messages: 96
Offline
[Profile] [PM]
Mình sử dụng PHP và MySql.
Mình có ý tưởng tìm kiếm trong trang tìm kiếm như sau:
- Giả sử mình cần tìm từ: "hva online" thì thuật toán tiến hành tìm như sau:
+ Tìm trong CSDL có từ "hva online" ko?
+ Sau đó tìm trong CSDL có tù "hva" ko?
+ Sau đó tìm trong CSDL có tù "online" ko?

Từ đó mình thiết kế 1 bảng SV gồm 2 trường: IdSV, hten

CREATE TABLE `sv` (
`idsv` tinyint(2) NOT NULL auto_increment,
`hten` varchar(100) NOT NULL default '',
PRIMARY KEY (`idsv`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 


Dữ liệu "đổ" vào dùng để test:
INSERT INTO `sv` VALUES (1, 'nguyen van a');
INSERT INTO `sv` VALUES (2, 'john smith');
INSERT INTO `sv` VALUES (3, 'alexander de nhi');
INSERT INTO `sv` VALUES (4, 'SMITH anderson');
INSERT INTO `sv` VALUES (5, 'Smith ander');
INSERT INTO `sv` VALUES (6, 'Nguyễn Hùng Cường');
INSERT INTO `sv` VALUES (7, 'Bảo thủ');
INSERT INTO `sv` VALUES (8, 'Đá bóng');
INSERT INTO `sv` VALUES (9, 'Lập trình');
 


Trang tìm kiếm mình thiết kế gồm 2 trang:
-Trang index.php:

Code:
<?
	include("dbinfo.php");
	$sql = "select * from sv";
	$result =  mysql_query($sql,$link);
	$i = 0;
	while ($row = mysql_fetch_array($result))
	{
		$i++;
		echo $i.". ".$row['hten']."<p>";
	}
?>
<h2>Tim kiem</h2>
<form id="form1" name="form1" method="post" action="result.php">
  <p>Nhap tu tim kiem
    <input type="text" name="txtkeyword" /> 
</p>
  <p>
    <input type="submit" name="Submit" value="Submit" />
</p>
</form>


-Trang result.php: Chứa thông tin kết quả tìm kiếm được.

Code:
<?
	include("dbinfo.php");
	$sql = "select * from sv";
	$result =  mysql_query($sql,$link);
	$i = 0;
	while ($row = mysql_fetch_array($result))
	{
		$i++;
		echo $i.". ".$row['hten']."<p>";
	}
?>

<h2>Ket qua tim kiem <?=$HTTP_POST_VARS["txtkeyword"] ?></h2>
<?
	function Search_A_Word($keyword,$link)
	{
		$sql = "Select * from sv where instr(sv.hten,'".$keyword."') > 0";
		$result = mysql_query($sql,$link);
		while ($row = mysql_fetch_array($result))
		{
			echo $row['hten']."<p>";
		}
	}//function
	
	$keyword = $HTTP_POST_VARS["txtkeyword"];
	if ($keyword <> "")
	{
		//Tim ca tu
		Search_A_Word($keyword,$link);
		//Tach tu theo khoang trang neu co	
		$search =  explode(" ",$keyword);
		if (count($search) > 1)
		{
			for ($i=0;$i<count($search);$i++)
			{
				Search_A_Word($search[$i],$link);
			}//for
		}//if (count($search) > 1)
	}//if ($keyword <> "")
?>
<p>
<h2><a href="index.php">Quay lai tim kiem</a></h2>

-Trang dbinfo.php: Chứa thông tin kết nối với CSDL

Code:
<?
	$db_host="localhost";
	$db_user="username;
	$db_pass="password";
	$db_name="test";//Ten CSDL can truy xuat
	$db_prefix="";	
	//Ket noi CSDL
	$link=mysql_connect($db_host,$db_user,$db_pass) or die("Loi ket noi CSDL so 1");
	mysql_select_db($db_name,$link);
?>


Mong nhận được sự nhận xét của anh em trong 4rum ....

[Up] [Print Copy]
  [Question]   Re: Thiết kế Website tìm kiếm 20/12/2007 01:03:28 (+0700) | #2 | 104776
[Avatar]
meomap_hp
Member

[Minus]    0    [Plus]
Joined: 04/12/2006 00:15:11
Messages: 46
Offline
[Profile] [PM]
- Tớ thấy ý tưởng cậu làm đúng roài (chưa test mã đúng hay sai), tuy nhiên theo tớ thì để nâng cấp chức năng tìm kiếm thì cậu phải thiết kế thêm bảng có các từ khóa tương đương nhau có thể sai chính tả VD gõ "bảo mật" cũng ra "security", "sử lý" ==> "xử lý", gõ nhầm "HIV" tìm cũng ra "HVA" smilie
- vì vậy khi tìm kiếm nó sẽ tìm cả các từ khóa tương đương nữa
[Up] [Print Copy]
  [Question]   Re: Thiết kế Website tìm kiếm 20/12/2007 12:37:10 (+0700) | #3 | 104903
jupiter29186
Member

[Minus]    0    [Plus]
Joined: 17/12/2005 12:31:58
Messages: 96
Offline
[Profile] [PM]
Sau khi Post bài lên hva mình có Post lên 1 số diễn đàn khác và có kết quả cải tiến trang tìm kiếm. Khắc phục nhược điểm cho ra kết quả trùng nhau với 1 số từ khóa từ khóa tìm kiếm:
Nội dung mới của trang result.php:


Code:
<?
	include("dbinfo.php");
	$sql = "select * from sv";
	$result =  mysql_query($sql,$link);
	$i = 0;
	while ($row = mysql_fetch_array($result))
	{
		$i++;
		echo $i.". ".$row['hten']."<p>";
	}
?>

<h2>Ket qua tim kiem <?=$HTTP_POST_VARS["txtkeyword"] ?></h2>
<?$var = '-_+*:,.@{}[]()~$#%^&=|;?/<>!';
    $len = strlen($var);
    $var = trim($var);
    for($i=0;$i<$len;$i++)
    {
    	$search[]= $var[$i];
        $replace[] = ' ';
    }
    $data = str_replace($search,$replace,$_POST['txtkeyword']);
    $data = str_replace('','',$_POST['txtkeyword']);
               
    $aquery= explode(' ',$_POST['txtkeyword']);  

    $where = "hten LIKE '%$data%'";
    foreach($aquery as $k=>$value) 
	{
    	$where .= " || hten LIKE '%$value%'";
    }
    $sql = "SELECT * FROM sv WHERE " . $where;
	$result = mysql_query($sql,$link);
	while ($row = mysql_fetch_array($result))
	{
		echo $row['hten']."<p>";
	}

?>
<p>
<h2><a href="index.php">Quay lai tim kiem</a></h2>



Về phần code thì "có vẻ" sáng sủa hơn và tốc độ thì nhanh hơn do không can thiệp quá nhiều vào CSDL ....
Mong nhận được ý kiến của mọi người về bài viết ...







Cùng học hỏi cùng tiến bộ ==> ^_^


[Up] [Print Copy]
  [Question]   Re: Thiết kế Website tìm kiếm 22/07/2008 07:33:44 (+0700) | #4 | 142687
[Avatar]
cuongbk
Member

[Minus]    0    [Plus]
Joined: 09/11/2004 00:58:45
Messages: 77
Location: Hà Nội
Offline
[Profile] [PM] [WWW] [Yahoo!]
Đoạn mã tìm kiếm này của bạn tìm kiếm rộng, nhưng kết quả trả ra là ko chuẩn, có cách nào ưu tiên sắp xếp khi hiển thị ra ngoài không nhỉ, ý mình nói là ưu tiên sắp xếp từ nhập vào và trả ra ý. Cụ thể hơn, khi bạn tìm từ "nhà hàng chè", nó sẽ tìm "nhà hàng chè" && "nhà" && "hàng" && "chè". Khi kết quả trả ra sẽ ưu tiên từ "nhà hàng chè" rồi sau đó mới đến các từ khác không nhỉ.
[Up] [Print Copy]
  [Question]   Re: Thiết kế Website tìm kiếm 25/07/2008 08:39:50 (+0700) | #5 | 143241
[Avatar]
cuongbk
Member

[Minus]    0    [Plus]
Joined: 09/11/2004 00:58:45
Messages: 77
Location: Hà Nội
Offline
[Profile] [PM] [WWW] [Yahoo!]
Hiện tại mình đã tìm đc cách khắc phục nhược điểm này

Mình sẽ khởi tạo thêm bảng trung gian khi nhấn nút submit và sau đó Drop luôn nó. Sau đây là đoạn mã của nó, mời các bác tham khảo:

$value = ($_GET["ten_quan"]);

$var = '-_+*:,.@{}[]()~$#%^&=|;?/<>!';
$len = strlen($var);
$var = trim($var);
for($i=0;$i<$len;$i++)
{
$search[]= $var[$i];
$replace[] = ' ';
}
$data = str_replace($search,$replace,$value);
$data = str_replace('','',$value);

$aquery= explode(' ',$value);

$where1 = "name LIKE '%".$data."%' || mon_an_chinh LIKE '%".$data."%'";

$where2 = "name LIKE '%".$data."%'";

foreach($aquery as $k=>$value1)
{
$where2 .= " || name LIKE '%".$value1."%'";
}

//echo $where1."<br>" ;
if($value)
{

$sql_create="CREATE TABLE `search_tt` (
`id_tem` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 250 ) NOT NULL ,
`image` VARCHAR( 150 ) NOT NULL ,
`gioi_thieu` MEDIUMTEXT NOT NULL ,
`id_xxx` BIGINT NOT NULL DEFAULT '0'
) ENGINE = MYISAM ;";

mysql_query($sql_create) ;


$sql_tim1="Select name,image,gioi_thieu,id_xxx from bangcantim where ".$where1 ;
$a_tim1 = $DB->query($sql_tim1);
while($b_tim1 = mysql_fetch_array($a_tim1))
{
đọc dữ liệu và insert vào bảng trung gian

$sql1="INSERT INTO search_tt () VALUES ()";
mysql_query($sql1);
}

$sql_tim2="Select name,image,gioi_thieu,id_xxx from bangcantim where ".$where2 ;
$a_tim2 = mysql_query($sql_tim2);
while($b_tim2 = mysql_fetch_array($a_tim2))
{
đọc dữ liệu và insert vào bảng trung gian

$sql2="INSERT INTO search_tt () VALUES ()";
mysql_query($sql1);
}

Sau đó truy vấn và lấy dữ liệu ra

$sql="select * from search_tt GROUP BY id_xxx order by id_tem asc";
.................................

$sql_drop="DROP TABLE search_tt" ;
mysql_query($sql_drop) ;
[Up] [Print Copy]
  [Question]   Re: Thiết kế Website tìm kiếm 26/07/2008 04:54:32 (+0700) | #6 | 143381
anhsuytu
Member

[Minus]    0    [Plus]
Joined: 11/01/2004 03:24:46
Messages: 62
Offline
[Profile] [PM]
Mỗi lần search 1 câu cái tạo 1 bảng sau đó lại drop đi .. vất vả nhỉ smilie. Trong trường hợp 2 người cùng truy cập vào một thời điểm .. 1 người vừa search xong 1 cái --> tạo table ->người kia search tiếp -> sao mà tạo được bảng nữa smilie. Đó là mới tính 2 người, còn nhiều người thì sao nhỉ? smilie .
[Up] [Print Copy]
  [Question]   Re: Thiết kế Website tìm kiếm 05/08/2008 00:23:26 (+0700) | #7 | 145060
[Avatar]
cuongbk
Member

[Minus]    0    [Plus]
Joined: 09/11/2004 00:58:45
Messages: 77
Location: Hà Nội
Offline
[Profile] [PM] [WWW] [Yahoo!]
Hai người truy cập vào cùng một thời điểm thì web sẽ báo msg cho bạn biết chứ sao, hoặc có thể thêm đoạn mã sau 2giây hoặc n giây gì đó sẽ cho phép tìm kiếm tiếp chả hạn..... cái này thì bạn phải biến tấu thêm cho đoạn tìm kiếm của mình, còn đoạn mã phía trên thì thì chỉ là biện pháp mình đưa ra thôi smilie , dù sao cũng thanks bạn smilie
[Up] [Print Copy]
  [Question]   Re: Thiết kế Website tìm kiếm 22/05/2009 09:37:27 (+0700) | #8 | 181422
lequi
Member

[Minus]    0    [Plus]
Joined: 29/04/2007 18:13:32
Messages: 77
Offline
[Profile] [PM]
hiện tại mình đang tìm hiểu về vấn đề này
Có cách nào tối ưu hơn cách tạo bảng không nhỉ ?
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|