我正在尝试为电子商务网站制作搜索框。
搜索工作如下
当用户搜索产品时,搜索值将通过ajax使用post方法发送到名为searchResults.php的文件
$searchVal=$_POST['searchVal'];
然后通过以下查询从名为product的表中搜索数据库
$searchResult = mysql_query("SELECT * FROM products WHERE name LIKE '$searchVal'")
并通过以下条件
将结果作为ajax响应发回if($searchResult){
echo "result";
}
else{
echo "No products found";
}
最重要的是一切都按预期工作正常。
假设用户正在搜索手机并且他/她键入手机。但我们的产品仅适用于手机类别,不适用于手机。因此,即使手机的记录存在,也没有找到产品。
无论白色空间,单数还是复数,我想进行搜索。我怎么能这样做?
答案 0 :(得分:2)
实现搜索引擎的正确方法是维护一个单独的单词表和指向它们出现的记录的链接。然后....
$qry="SELECT p.*, COUNT(*)
FROM products p
INNER JOIN srchwords s
ON p.id=s.product_id ";
$searchVals=explode(' ',$_POST['searchVal']);
foreach ($searchvals as $k=>$s) {
$searchvals[$k]="'" . mysql_real_escape_string(trim($s)) . "'";
}
$qry.="WHERE s.word IN (" . implode(",",$searchvals) . ") ORDER BY COUNT(*) DESC";
一个丑陋且无效的黑客攻击:
$qry="SELECT p.*
FROM products p";
$join=" WHERE "
$searchVals=explode(' ',$_POST['searchVal']);
foreach ($searchvals as $k=>$s) {
$qry.=$join . " p.desc LIKE '%" . mysql_real_escape_string(trim($s)) . "%'
$join=' OR ';
}
这两种方法仍然不能满足复数(只需为以S结尾的单词添加额外的比较,删除S)。你还应该清理字符串以删除多个空格和标点符号(/ ^ [a-z0-9] / i)。
或者只使用众多写得很好的现成搜索引擎解决方案之一(例如mnogo引擎或Google的网站搜索服务)。
答案 1 :(得分:1)
第1步:删除前导和尾随空格:
$searchResult = mysql_query("SELECT * FROM products WHERE name LIKE trim('$searchVal')")
第2步:用'%'替换现有空格(它是LIKE
语法中的通配符):
$searchResult = mysql_query("SELECT * FROM products WHERE name LIKE str_replace(trim('$searchVal'), ' ', '%'")
答案 2 :(得分:1)
第一步是在空格上展开()搜索词:$terms = explode(' ', $query)
,然后执行'SELECT * FROM products WHERE name LIKE "%'.$terms[0].'%" AND name LIKE "%'.$terms[1].'%" ...'
。
当然,这并没有真正解决你的复数问题。而且,它可能非常非常慢,因为MySQL不能在LIKE查询上使用索引通配符。
另一个行动方案可能就是拥有一个"别名"表格看起来像这样:
cellphone | cell phone
cellphone | cell phones
cellphone | cellphones
...
然后,您将在搜索查询数据库之前用左边的那个替换搜索查询中的所有出现次数。
第三种也是最好也是最复杂的方法是使用索引表。你不会想自己写这个,但我敢打赌那里有一些很好的解决方案。我个人使用Doctrine which has this feature built in。
答案 3 :(得分:0)
你可以在php中使用trim()从字符串的开头和结尾去掉空格(或其他字符)