MySQL 上的全文搜索:在一个数据库中按多个词执行搜索 table

Full Text Search on MySQL : Perform search by multiple words in one DB table

我有用户数据库 table:

|firstname|lastname|username|Country|id|
------------------------------------------------
|Ricky    |Jonh    |rjohn   |USA    |1 |
|Mery     |Cris    |mcris   |USA    |2 |
|Ricky    |Cris    |rcris   |Germany|3 |
|Michacle |Ricky   |mricky  |USA    |4 |
|Michacle |Jonh    |john    |USA    |5 |

如果用户键入:

因此搜索应该 return 记录搜索的每个单词应该在一个记录中但可以在不同的列中。

有人可以分享如何在 MySQL 上实现此类搜索的方法。

这涉及设置然后使用 FULLTEXT 索引。这将设置索引 (https://www.db-fiddle.com/f/2E7ep7eos8wNWUNq6VTCEv/0):

CREATE FULLTEXT INDEX textindex ON user (firstname, lastname, username, country);  

这就用到了。它显示了每条记录的全文分数,并将它们的分数排在第一位。

SELECT *,
       MATCH (firstname, lastname, username, Country)
         AGAINST ('Ricky Cris Germany' IN NATURAL LANGUAGE MODE) AS score
  FROM user 
 WHERE MATCH (firstname, lastname, username, Country)
         AGAINST ('Ricky Cris Germany' IN NATURAL LANGUAGE MODE)
ORDER BY score DESC

自然语言模式下的 FULLTEXT 本质上是模糊的。它旨在向用户显示候选搜索结果,以便她可以 select 获得相关结果。它喜欢 return 很多 "false positive" 行,希望得分低于实际行。 编辑 FULLTEXT 的工作方式类似于互联网搜索引擎:它显示多个结果并尽最大努力按相关性对它们进行排名。然后它依赖于用户选择所需的结果。对 FULLTEXT 的期望太高了,因为它会从结果集中删除不需要的项目。

此外,FULLTEXT 自然语言搜索在少于几百行的表上会做一些奇怪的事情。因此,如果您的小测试台似乎没有做正确的事情,请不要气馁。

谢谢,O. Jones

这是一个解决方案

  SELECT *,
  MATCH (firstname, lastname, username, Country) 
         AGAINST ('+Ricky +Cris +Germany' IN boolean MODE) AS score
  FROM user 
  WHERE MATCH (firstname, lastname, username, Country)
         AGAINST ('+Ricky +Cris +Germany' IN boolean MODE)
  ORDER BY score DESC