【问题标题】:Full Text Search on MySQL : Perform search by multiple words in one DB tableMySQL 上的全文搜索:在一个 DB 表中执行多个单词的搜索
【发布时间】:2020-08-08 06:53:16
【问题描述】:

我有用户数据库表:

|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 |

如果用户输入:

  • “Ricky” - 搜索应返回 3 条记录 (1,3,4)

  • “Ricky USA” - 应该返回 2 条记录(因为只有第一条和第三条记录的列上有这些词)

  • “Ricky John USA” - 仅返回第一条记录。

所以搜索应该返回记录,其中每个搜索词应该在一个记录中,但可以在不同的列上。

有人可以分享一个如何在 MySQL 上实现这种搜索的方法吗?

【问题讨论】:

    标签: mysql algorithm search full-text-search


    【解决方案1】:

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

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

    这使用它。它显示了每条记录的 FULLTEXT 分数,并将最高分排在第一位。

    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 本质上是模糊的。它旨在向用户显示候选搜索结果,以便她可以选择相关的搜索结果。它喜欢返回很多“误报”行,希望分数低于真实行。 编辑 FULLTEXT 像互联网搜索引擎一样工作:它显示多个结果并尽最大努力尝试按相关性对它们进行排名。然后它依赖于用户选择所需的结果。对 FULLTEXT 的期望太高了,它会从结果集中删除不需要的项目。

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

    【讨论】:

    • 感谢您的回答,但在您的情况下,查询返回了 4 条记录。就我而言,它应该只返回一条记录
    • 如果您只需要返回您期望的确切行数,MySQL 的 FULLTEXT 不适合您的应用程序。阅读我的最后两段。
    • 如果全文搜索不合适,能不能提点别的?
    • 我相信它适用于您提出的许多应用程序。但它旨在与人类用户一起工作。如果这对您不起作用,您可能应该使用复杂的 WHERE 子句,例如 WHERE (firstname LIKE '%rick%' OR lastname LIKE '%rick%' 在 Sphinx (sphinxsearch.com) 中提供了更复杂的搜索引擎,但这也需要人工选择最佳结果。
    【解决方案2】:

    谢谢,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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 2015-08-20
      • 2013-12-18
      • 1970-01-01
      • 2010-11-10
      • 2011-10-06
      • 1970-01-01
      相关资源
      最近更新 更多