2012-02-27 89 views
1

我已经实现了一个数据库,产品名称,描述,类型等,并起初我生成一个查询一个简单的搜索代码发送的productid(MySQL的主键),通过JSON到PHP实现在远程服务器上。所以,现在我想实现一个搜索,用户可以在搜索栏上插入多个单词,并且查询返回与单词匹配的所有产品。例如,如果用户搜索“绿色椅子”,我将查询返回所有在字段颜色上具有绿色字词的产品,并在字段产品中包含字词主席。任何想法,我该如何执行这个?多个词搜索栏

什么是使用这样的查询的主要问题:

SELECT * , MATCH() AGAINST ('$search') AS points FROM productstb WHERE MATCH (PRODUCT,DESCRIPTION) AGAINST ('$search') ORDER BY points DESC LIMIT 50 

,我读了它,当你用一个词lonly这是真的产生问题?

解决:我用这个PHP文件来照顾一切,感谢所有的提示,他们非常usufull,我也尝试过使用Lucene更快尤其是对于长期n个数据基地,但不幸的是,我不能决定移动到lucen DB

<?php 
mysql_connect("localhost","root","soltux"); 
mysql_select_db("baseDatosMobil"); 

$search = $_POST['precio']; 
$parts=explode(" ", $search); 
$number=count($parts); 

if ($number==1) { 
    $quer="SELECT ARTI,PRESENT,PRECBOL,PROV,CODART FROM PRODFAR WHERE ARTI LIKE '%$busqueda%' LIMIT 10"; 
} 
elseif ($number>1) { 
    $quer= "SELECT ARTI, PRESENT, PROV,CODART, PRECBOL, MATCH (ARTI, PRESENT, PROV) AGAINST ('+$search') AS Score FROM PRODFAR WHERE MATCH (ARTI, PRESENT, PROV) AGAINST ('+$search') ORDER BY Score DESC LIMIT 10"; 

} 
$q=mysql_query($quer); 
while($e=mysql_fetch_assoc($q)){ 
    $e['ARTI']=utf8_encode($e['ARTI']); 
    $e['PRESENT']=utf8_encode($e['PRESENT']); 
    $e['PROV']=utf8_encode($e['PROV']); 
    $output[]=$e; 
} 
print(json_encode($output)); 
mysql_close(); 

?> 

回答

0

当然这取决于DB计划,但当然你要保持像一些索引表“搜索词 - >产品”和更新它,当你做一些你的商品清单。当用户输入两个或多个单词时,简单查询每个键的DB并计算DB答案的交集。

然后,你还可以添加另一个字段索引表中显示的每个项目的“神似”,这样你就可以通过它来进行排序 - 从而用户将看到“更常见的项目”第一。

2

如果你想允许全文搜索你需要实现一些指标。一个简单的fieldname like "%$term%%"不会很高性能,Mysql不是很擅长全文搜索。我建议为此使用Lucene

+0

或使用斯芬克斯:http://sphinxsearch.com/ – Stefan 2012-02-27 14:54:52

+0

但问题是,最终客户需要这个解决方案,我不得不卖掉以后,使用MySQLm。也会更好,因为lucene更开放 – 2012-02-27 15:57:41