我目前在PHP + MYSQL网站上有一个搜索选项。
MYSQL查询目前类似于“SELECT pageurl WHERE name LIKE'%$ query%'。
我在这里发布的原因是因为我注意到如果我的某个产品的名称是“Blue Bike”并且有人查找“Bike Blue”,则不会返回任何结果。
我正在寻找解决方法,因为我知道如果我输入谷歌相同的单词,会出现一些问题。
我正在考虑创建一个PHP函数,以便在查询包含4个或更少的单词时混合查询中的所有单词,生成大约24个查询。
对此有更简单的解决方案吗?
感谢您的时间
答案 0 :(得分:5)
如果没有合适的答案,不要放手:
<?php
$search = 'this is my search';
$searchSplit = explode(' ', $search);
$searchQueryItems = array();
foreach ($searchSplit as $searchTerm) {
/*
* NOTE: Check out the DB connections escaping part
* below for the one you should use.
*/
$searchQueryItems[] = "name LIKE '%" . mysqli_real_escape_string($searchTerm) . "%'";
}
$query = 'SELECT pageurl FROM names' . (!empty($searchQueryItems) ? ' WHERE ' . implode(' AND ', $searchQueryItems) : '');
?>
<强>的mysqli _ 强>:
继续使用mysqli_real_escape_string
或使用$mysqli->real_escape_string($searchTerm)
。
<强>的MySQL _ 强>:
如果您使用mysql_
,则应使用mysql_real_escape_string($searchTerm)
(并考虑因弃用而更改)。
<强> PDO 强>:
如果您使用PDO,则应使用trim($pdo->quote($searchTerm), "'")
。
答案 1 :(得分:3)
您正在寻找的是全文搜索。 尝试使用Sphinx,速度非常快,并且可以很好地与MySQL集成。
答案 2 :(得分:1)
答案 3 :(得分:1)
我编写了一个接近Google操作的函数,考虑了要作为整个块搜索的元素的双引号。它没有考虑 - 或*指令。
表:要考虑的MySQL表
cols:要解析的列数组
searchParams:搜索进行处理。例如:红色野马“Florida 90210”
function naturalQueryConstructor($table, $cols, $searchParams) {
// Basic processing and controls
$searchParams = strip_tags($searchParams);
if( (!$table) or (!is_array($cols)) or (!$searchParams) ) {
return NULL;
}
// Start query
$query = "SELECT * FROM $table WHERE ";
// Explode search criteria taking into account the double quotes
$searchParams = str_getcsv($searchParams, ' ');
// Query writing
foreach($searchParams as $param) {
if(strpos($param, ' ') or (strlen($param)<4)) {
// Elements with space were between double quotes and must be processed with LIKE.
// Also for the elements with less than 4 characters. (red and "Florida 90210")
$query .= "(";
// Add each column
foreach($cols as $col) {
if($col) {
$query .= $col." LIKE '%".$param."%' OR ";
}
}
// Remove last ' OR ' sequence
$query = substr($query, 0, strlen($query)-4);
// Following criteria will added with an AND
$query .= ") AND ";
} else {
// Other criteria processed with MATCH AGAINST (mustang)
$query .= "(MATCH (";
foreach($cols as $col) {
if($col) {
$query .= $col.",";
}
}
// Remove the last ,
$query = substr($query, 0, strlen($query)-1);
// Following criteria will added with an AND
$query .= ") AGAINST ('".$param."' IN NATURAL LANGUAGE MODE)) AND ";
}
}
// Remove last ' AND ' sequence
$query = substr($query, 0, strlen($query)-5);
return $query;
}
感谢stackoverflow社区,我发现了这个功能的一部分!
答案 4 :(得分:0)
要像谷歌一样进行搜索,你需要许多数据库和索引节点,疯狂的算法......现在你想出了一个类似于SELECT ... ... lol:D
MySQL搜索速度慢,您需要正确设置全文和索引(MyISAM或Aria Engine)。要搜索的组合或不同实体几乎无法正确且快速地实现。
我建议设置一个基于Apache的Lucene的Elasticsearch服务器。 搜索速度非常快,易于维护。而且您不必关心SQL注入,并且仍然可以快速使用mysql服务器。
Elasticsearch(或其他基于Lucene的搜索引擎,如SolR)可以轻松安装在任何服务器上,因为它们是用Java编写的。
良好的文档:
http://www.elasticsearch.org/guide/en/elasticsearch/client/php-api/current/
答案 5 :(得分:-1)
我先做explode
:
$queryArray = explode(" ", $query);
然后生成SQL
查询,例如:
for ($i=0; $i< count($queryArray); $i++) {
$filter += " LIKE '%" + $queryArray[$i] + "%' AND" ;
}
$filter = rtrim ($filter, " AND");
$sql = "SELECT pageurl FROM ... WHERE name " + $filter
(注意:尚未测试/运行此代码)