Max*_*Max 10 php mysql sql full-text-search
我目前有一个搜索字段使用此代码搜索多个列:
$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++;
}
Run Code Online (Sandbox Code Playgroud)
可以说我在表中有这两行:
id | last_name | first_name | email
1 | Smith | John | john_smith@js.com
2 | Smith | Bob | bob_smith@js.com
Run Code Online (Sandbox Code Playgroud)
如果我输入"John S",则只有第一个结果显示哪个是所需行为.
如果我输入"John Smith",则只有第一个结果显示哪个是所需的行为.
如果我键入"Smith J",即使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)";
Run Code Online (Sandbox Code Playgroud)
Wri*_*ken 10
在布尔模式下,要求字符串存在(而不是只是得分更高),完成+.前缀匹配是以结尾完成的*.这似乎是你想要的,所以搜索:
+John* +S*
+John* +Smith*
+Smith* +J*
+Jo* +S*
Run Code Online (Sandbox Code Playgroud)
请注意,全文索引无法帮助您搜索"单词中的任何位置".所以类似的东西*mith*必然会失败:它们的意思是匹配索引中的字符1.
如果您还想按匹配值对它们进行排序,例如,John Smith 之前 需要Johnny Smithson,您可以这样做:
SELECT * FROM user
WHERE MATCH(..fields..) AGAINST ('match' IN BOOLEAN MODE)
ORDER BY MATCH(..fields..) AGAINST ('match' IN BOOLEAN MODE) DESC;
Run Code Online (Sandbox Code Playgroud)
除非你ft_min_word_len再单独添加所有单词> = ,否则你会看到它将无处可寻:
+John* +S* John
+John* +Smith* John Smith
+Smith* +J* Smith
+Jo* +S*
Run Code Online (Sandbox Code Playgroud)
对于最后一个,两个都是<默认的4个字符,所以我们不能在默认的mysql中为它添加排序参数,但你可以设置ft_min_world_len不同的所需.