我目前有一个使用此代码搜索多个列的搜索字段:
$searchArray = explode(" ", $searchVal);
$query="SELECT * FROM users WHERE ";
$i=0;
foreach ($searchArray as $word) {
if ($i != 0) $query .= " OR ";
$query .= " MATCH (`first_name`, `last_name`, `email`) AGAINST ('".$word."*' IN BOOLEAN MODE)";
$i++;
}
假设我在表中有这两行:
id | last_name | first_name | email
1 | Smith | John | john_smith@js.com
2 | Smith | Bob | bob_smith@js.com
如果我输入“John S”,则只有第一个结果会显示所需的行为。
如果我输入“John Smith”,则只有第一个结果会显示所需的行为。
如果我键入“Smith J”,即使 Bob 不匹配,两个结果都会显示。
如果我键入“Smith John”,即使 Bob 不匹配,两个结果都会显示。
最后,如果我键入“Jo S”,尽管“Jo”和“S”部分匹配,但不会返回任何结果。
谁能帮我修复我的查询以处理不重要且部分结果匹配的订单所需功能?如果它可以按最佳匹配(即单词的最长部分,仅从第一个字母开始,而不是中间的部分,列数最多)进行排序,那也将是一个巨大的帮助。
更新:
只是想发布基于解决方案的最终代码。我的循环创建多个匹配语句不正确,我的 ft_min_word_len 也是如此。
我的代码现在是:
$searchArray = explode(" ", $searchVal);
$query="SELECT * FROM users WHERE MATCH (`first_name`, `last_name`, `email`) AGAINST ('";
$i=0;
foreach ($searchArray as $word) {
$query .= "+".$word."* ";
}
$query .= "' IN BOOLEAN MODE)";