4 回答
TA贡献1884条经验 获得超4个赞
为什么您不使用 sql like 运算符,我为您提供了名为 products 的表中名为 Product 的列中的多个单词的示例
$db=mysqli_connect('localhost','root','','project');
$search=$_GET['userinput'];
$searcharray = explode(' ', $search);
$searchpdo=array();
$finalstate="";
foreach ( $searcharray as $ind=> $query){
$sql=array();
$exp='%'.$query.'%';
array_push($sql,"(title LIKE ?)");
array_push($searchpdo,$exp);
array_push($sql,"(keywords LIKE ?)");
array_push($searchpdo,$exp);
if($finalstate==""){
$finalstate = "(".implode(" OR ",$sql).")";
}
else{
$finalstate = $finalstate." AND "."(".implode(" OR ",$sql).")";
}
}
$stmt = $db->prepare("SELECT * FROM products WHERE (".$finalstate.") ");
$types=str_repeat('s',count($searchpdo));
$stmt->bind_param($types,...$searchpdo);
$stmt->execute();
$result = $stmt->get_result();
这将为您提供单个单词或多个单词的正确结果
TA贡献1831条经验 获得超9个赞
你的问题有多个方面
如果可用,请先使用 mysql 客户端而不是 PHP 来运行查询,直到您的查询准备好达到您想要的效果
如果您最近的文档(记录)显示在搜索结果的顶部,则需要更改您的
ORDER BY
条款。目前,它应该返回最接近的匹配(即 byrelevance
)。
您需要在自定义逻辑中在relevance
和recency
(不清楚如何定义)之间取得平衡。一个简单的例子,将上周优先于上个月,将上个月优先于其余:
SELECT
....
, DATEDIFF (ItemDate, CURDATE() ) ItemAgeInDays
ORDER BY
relevance
* 100
* CASE
WHEN ItemAgeInDays BETWEEN 0 AND 7 --- last week
THEN 20
WHEN ItemAgeInDays BETWEEN 0 AND 30 --- last month
THEN 10
ELSE 1
END
DESC
你说单个词项无法搜索。在 中BOOLEAN MODE
,您为搜索构建布尔逻辑,并为此使用特殊字符。例如+apple
意味着“apple”必须存在。您的单个单词可能与这些字符发生冲突。
您说查询没有返回正确的结果。FULL TEXT
搜索在每个文档(行)中搜索您的登录名,并查找它在每个文档中出现的次数。然后,它会抵消您的搜索在所有文档中出现的次数。这意味着它会优先考虑 您的搜索出现次数远高于平均水平的记录。如果您的搜索区分度不够,并且大多数文档在该搜索方面与每个文档相似,则可能看起来不正确。
BOOLEAN MODE
默认情况下不对结果进行排序relevance
。您需要自己添加 ORDER BY,您已经这样做了。只是想在这里为其他人指出
TA贡献1789条经验 获得超10个赞
当在 WHERE 子句中使用 MATCH() 时,返回的行将自动按照相关性最高的排在最前面。
因此,您所要做的就是从 select 中删除匹配项并将其放入 where 条件中。
TA贡献1779条经验 获得超6个赞
我认为你必须稍微调整你的查询,你会得到如下期望的结果:
$sql = mysql_query("SELECT * FROM patient_db WHERE MATCH ( Name, id_number ) AGAINST ('+firstWord +SecondWord +ThirdWord' IN BOOLEAN MODE);");
如果你想进行精确搜索:
$sql = mysql_query("SELECT * FROM patient_db WHERE MATCH ( Name, id_number ) AGAINST ('"Exact phrase/Words"' IN BOOLEAN MODE);");
我也在某个帖子中发布了相同的答案,但不知道该帖子
- 4 回答
- 0 关注
- 150 浏览
添加回答
举报