【问题标题】:mySQL LIKE querymySQL LIKE 查询
【发布时间】:2010-11-26 21:52:15
【问题描述】:

我正在尝试在我的数据库中搜索一个字符串,但它应该能够匹配任何单词而不是整个短语。

假设,一个表格数据包含a b c d e f g 这样的文本。然后,如果我搜索d c b,它应该能够显示结果。

field LIKE '%d c b%' 不能以这种方式工作。

有人可以建议一种更强大的搜索方式,还可以显示相关性计数器。

我不介意在上面也使用 PHP,但更喜欢在数据库级别进行搜索。

【问题讨论】:

    标签: php mysql search full-text-search


    【解决方案1】:

    为获得最佳结果,您需要在数据上创建FULLTEXT 索引。

    CREATE TABLE mytable (id INT NOT NULL, data TEXT NOT NULL, FULLTEXT KEY fx_mytable_data) ENGINE=MyISAM
    
    SELECT  *
    FROM    mytable
    WHERE   MATCH(data) AGAINST ('+word1 +word2 +word3' IN BOOLEAN MODE)
    

    请注意,要索引单字母单词(如您的示例中所示),您需要在 MySQL 配置中将 ft_min_word_len 设置为 1

    即使您没有索引(只要您的表是MyISAM),此语法也可以工作,但会很慢。

    【讨论】:

      【解决方案2】:

      我认为你想要做的是,对于任何字母:

      field LIKE '%d%' or field like '%c%' or field like '%b%'
      

      所有字母

      field LIKE '%d%' and field like '%c%' and field like '%b%'
      

      【讨论】:

      • 但这将返回任何拥有它们的任何东西,而不是只返回那些拥有全部或部分它们的东西。
      • 是的,但这似乎不是他想要“匹配任何单词而不是整个短语”的要求。
      • -1 这也会返回一个字符串,例如“dhhlkjfyfjfjfckjhtyfgvb”,在这种情况下你也可以说'LIKE'%d%c%b%'。
      • `LIKE '%d%c%b%'。不起作用,因为它与“a b c d e f g”不匹配。
      【解决方案3】:

      如果您的表在 MyISAM 中,您可以使用 MySQL 中集成的 FULLTEXT 搜索:11.8. Full-Text Search Functions

      虽然会有一些限制(例如,如果我没记错的话,你不能搜索短于 X 个字符的单词——X 通常是 3 或 4)。


      另一种解决方案是使用一些全文引擎,例如LuceneSolrSphinx——它们通常在全文搜索方面做得更好:这是他们的工作 (MySQL 的工作是存储数据,而不是全文搜索)

      关于 SO 的问题有很多;例如:


      如果您使用的是 PHP 并且无法安装其他任何东西,那么有一个完整的 Lucene 实现:Zend_Search_Lucene

      【讨论】:

        【解决方案4】:

        最后,MySQL LIKE 子句并不打算用作“强大”的搜索工具来进行基于单词的匹配。这是一个查找部分短语的简单工具。它也不擅长扩展,因此如果您在高端吞吐量网站上执行此操作,您可能需要另一种解决方案。

        话虽如此,有一些选项供您选择,以获得您想要的:

        • REGEX 支持,MySQL 支持REGEX based searches。使用它,并使用足够复杂的 REGEX,您可以找到所需的内容。

        • MySQL 中的真正全文索引。 MySQL 确实有办法创建FULLTEXT indexes。您需要使用 MyISAM 数据引擎,并且您可以做什么或不能做什么是有限制的。但它比 SQL 所具有的基本“like”功能强大得多。如果您有兴趣,我建议您阅读它。

        • 第三方索引器。这实际上是大多数人走的路线。他们将使用Lucene / Solr 或其他类似的索引技术,专门用于对具有各种逻辑的单词进行全文搜索,就像现代网络搜索引擎的工作方式一样。它们非常高效,因为它们本质上保留了自己的数据库,将所有内容分解并以最适合这些类型的搜索的方式存储。

        希望这三个选项之一对您有用。

        【讨论】:

          【解决方案5】:

          使用like 子句时,请注意它是%variable%variable% 而不是%variable

          其次。要进行情感搜索,请使用explode 函数来打断单词,例如如果我搜索“learn php”,它应该像在 Google 中那样搜索:“learn+php”。这是explode() 函数。

          【讨论】:

          • 这听起来更像是评论而不是答案。
          猜你喜欢
          • 2019-01-04
          • 2017-01-03
          • 1970-01-01
          • 1970-01-01
          • 2011-10-04
          • 2023-03-26
          • 2021-05-08
          • 2010-12-28
          • 2015-05-26
          相关资源
          最近更新 更多