代码之家  ›  专栏  ›  技术社区  ›  Alec Smart

类MySQL查询

  •  4
  • Alec Smart  · 技术社区  · 15 年前

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

    假设表数据具有类似文本的 a b c d e f g . 那么如果我搜索 d c b 它应该能够显示结果。

    field LIKE '%d c b%' 不是这样的。

    有人能建议一个更强大的搜索方式,可能也显示相关计数器。

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

    5 回复  |  直到 10 年前
        1
  •  4
  •   Quassnoi    15 年前

    为了获得最佳效果,您需要创建 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)
    

    请注意,要索引一个字母单词(如示例中所示),需要设置 ft_min_word_len 1 在里面 MySQL 配置。

    即使没有索引(只要您的表是 MyISAM 但是会很慢。

        2
  •  2
  •   Nick Berardi    15 年前

    我想你要做的是,对于任何一封信:

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

    所有的信件

    field LIKE '%d%' and field like '%c%' and field like '%b%'
    
        3
  •  1
  •   Community CDub    8 年前

    如果表在myisam中,则可以使用mysql中集成的全文搜索: 11.8. Full-Text Search Functions

    尽管会有一些限制(例如,如果我没记错的话,您不能搜索少于x个字符的单词——x通常是3或4)。


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

    关于这样的问题有很多,例如:


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

        4
  •  1
  •   Eli    15 年前

    最后,类似于mysql的子句并不打算用作“强大的”搜索工具来进行基于单词的匹配。这是一个找到部分短语的简单工具。它的伸缩性也不是很好,所以如果您在一个高端的吞吐量网站上这样做,您可能需要另一个解决方案。

    也就是说,你有一些选择,可以得到你想要的:

    • regex支持,mysql有做的支持 REGEX based searches . 使用它,再加上一个足够复杂的regex,你就能找到你想要的。

    • MySQL中的真全文索引。MySQL确实有一种创建 FULLTEXT indexes . 您需要使用myisam数据引擎,并且对您能做什么或不能做什么有限制。但它比SQL所具有的基本“类似”功能强大得多。如果你感兴趣的话,我建议你读一下。

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

    希望这三个选项中的一个对你有用。

        5
  •  0
  •   Kos    12 年前

    当使用 like 注意它是 %variable% variable% %variable .

    其次。要进行情感搜索,请使用 explode 函数来破坏单词,比如如果我搜索“learn php”,它应该这样搜索:“learn+php”,就像在google中一样。它是 explode() 功能。