当前位置: 首页 > 面试题库 >

如何在部分单词匹配的情况下进行多列mysql全文搜索

卓致远
2023-03-14
问题内容

我目前有一个搜索字段,使用此代码针对多个列进行搜索:

$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)";

问题答案:

在布尔模式下,需要使用字符串(而不是得分更高),使用来完成+。前缀匹配以结尾结尾*。这似乎是您想要的,因此搜索:

+John* +S*
+John* +Smith*
+Smith* +J*
+Jo* +S*

请注意,全文索引无法帮助您搜索“单词中的任何地方”。所以类似*mith*的注定会失败:它们是要与索引中的字符1匹配的。

如果您还想按匹配值对它们进行排序,例如,需要John Smith before Johnny Smithson,则可以这样做:

 SELECT * FROM user 
 WHERE MATCH(..fields..) AGAINST ('match' IN BOOLEAN MODE)
 ORDER BY MATCH(..fields..) AGAINST ('match' IN BOOLEAN MODE) DESC;

除非ft_min_word_len再次单独添加所有单词> = ,否则您将看到的内容将无济于事:

+John* +S* John
+John* +Smith* John Smith
+Smith* +J* Smith
+Jo* +S*

对于最后一个,两个都是<默认的4个字符,因此我们不能在默认的mysql中为其添加排序参数,但是可以设置ft_min_world_len不同的值。



 类似资料:
  • 问题内容: MySQL全文搜索似乎是一种很棒的方法,也是使用SQL进行搜索的最佳方法。但是,我似乎停留在以下事实:它不会搜索部分单词。例如,如果我有一篇标题为“ MySQL Tutorial”的文章并搜索“ MySQL”,它将找不到它。 完成一些搜索后,我发现MySQL 4中提供了各种支持该功能的参考(我使用的是5.1.40)。我曾尝试使用“ MySQL ”和“%MySQL%”,但均无效(我发现一

  • 本文向大家介绍在MySQL中搜索多列以进行行匹配,包括了在MySQL中搜索多列以进行行匹配的使用技巧和注意事项,需要的朋友参考一下 为此,请使用UNION。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 以下是搜索多列的查询- 这将产生以下输出-

  • 问题内容: 我希望能够在整个文件上运行正则表达式,但是我希望不必一次将整个文件读入内存,因为将来我可能会处理相当大的文件。有没有办法做到这一点?谢谢! 说明: 我无法逐行阅读,因为它可能跨越多行。 问题答案: 您可以使用mmap将文件映射到内存。然后可以像普通字符串一样访问文件内容: 这也适用于大文件,文件内容根据需要从磁盘内部加载。

  • 问题内容: 我有一个类似于http://drive.google.com的链接,并且我想在该链接之外匹配“ google”。 我有: 但这仅在整个文本为“ google”时才匹配(不区分大小写,因此也匹配Google或GooGlE等)。如何匹配另一个字符串中的“ google”? 问题答案: 关键是您使用的ElasticSearch正则表达式需要 完整的字符串匹配 : Lucene的模式总是锚定的

  • 问题内容: 我第一次使用Postgresql,并且试图在我的网站中创建一个搜索引擎。我有这张桌子: 然后我为表的每个字段创建了一个索引(这是正确的方法吗?或者我可以为所有字段创建一个索引?): 现在,如果我想在每个索引中搜索一个单词,SQL查询是什么? 我尝试了这个,它的工作原理: 是否存在更好的方法来做到这一点?我可以搜索多个吗?我的一个朋友提出了一个解决方案,但这是针对MySQL数据库的: P

  • 问题内容: 我正在努力从我们的数据库中淘汰某个客户。我注意到一种趋势,人们用与他们填写公司名称相同的名字来填写名字。因此,示例如下所示: 这些人是我不想被查询的人。他们是坏蛋。我正在尝试将查询与WHERE语句(大概)组合在一起,以隔离姓氏至少与公司名称部分匹配的人,但是我很困惑,可以使用一些帮助。 问题答案: 您可以采用基于相似性的方法 在答案底部尝试代码 它会产生如下结果 因此,您将能够根据相似