代码之家  ›  专栏  ›  技术社区  ›  Ross

MySQL全文不工作

  •  25
  • Ross  · 技术社区  · 15 年前

    我正在尝试使用MySQL的全文索引为我的PHP web应用程序添加搜索支持。

    我创建了一个测试表(使用MyISAM类型,带有一个文本字段) a )并输入了一些样本数据。现在,如果我是对的,那么以下查询将返回这两行:

    SELECT * FROM test WHERE MATCH(a) AGAINST('databases')
    

    但是它没有返回任何值。我已经做了一些研究,并且尽我所能把一切都做好了——这个表是MyISAM表,设置了全文索引。我尝试从提示符和phpMyAdmin运行查询,但没有成功。我错过了什么重要的东西吗?


    更新: 好的,虽然Cody的解决方案在我的测试用例中起作用,但在我的实际表格中似乎不起作用:

    CREATE TABLE IF NOT EXISTS `uploads` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` text NOT NULL,
      `size` int(11) NOT NULL,
      `type` text NOT NULL,
      `alias` text NOT NULL,
      `md5sum` text NOT NULL,
      `uploaded` datetime NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
    

    我使用的数据是:

    INSERT INTO `uploads` (`id`, `name`, `size`, `type`, `alias`, `md5sum`, `uploaded`) VALUES
    (1, '04 Sickman.mp3', 5261182, 'audio/mp3', '1', 'df2eb6a360fbfa8e0c9893aadc2289de', '2009-07-14 16:08:02'),
    (2, '07 Dirt.mp3', 5056435, 'audio/mp3', '2', 'edcb873a75c94b5d0368681e4bd9ca41', '2009-07-14 16:08:08'),
    (3, 'header_bg2.png', 16765, 'image/png', '3', '5bc5cb5c45c7fa329dc881a8476a2af6', '2009-07-14 16:08:30'),
    (4, 'page_top_right2.png', 5299, 'image/png', '4', '53ea39f826b7c7aeba11060c0d8f4e81', '2009-07-14 16:08:37'),
    (5, 'todo.txt', 392, 'text/plain', '5', '7ee46db77d1b98b145c9a95444d8dc67', '2009-07-14 16:08:46');
    

    我现在运行的查询是:

    SELECT * FROM `uploads` WHERE MATCH(name) AGAINST ('header' IN BOOLEAN MODE)
    

    它应该返回第3行,标题_bg2.png。相反,我得到了另一个空结果集。我的布尔搜索选项如下:

    mysql> show variables like 'ft_%';
    +--------------------------+----------------+
    | Variable_name            | Value          |
    +--------------------------+----------------+
    | ft_boolean_syntax        | + -><()~*:""&| |
    | ft_max_word_len          | 84             |
    | ft_min_word_len          | 4              |
    | ft_query_expansion_limit | 20             |
    | ft_stopword_file         | (built-in)     |
    +--------------------------+----------------+
    5 rows in set (0.02 sec)
    

    2 回复  |  直到 15 年前
        1
  •  50
  •   Harrison Fisk    15 年前

    添加更多数据。默认情况下,MySQL将忽略表中50%或更多行中的任何单词,因为它认为这是一个“噪音”单词。

        2
  •  25
  •   Cody Caughlan    15 年前

    MySQL全文搜索有两种模式:自然语言模式和布尔模式。自然语言模式的一个限制是“……出现在50%或更多行中的单词被视为常见且不匹配。如果没有给出修改器,则全文搜索为自然语言搜索。”自然语言是默认模式。全文文档中记录了这一点:

    http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

    如果将查询切换到使用布尔模式:

    SELECT * FROM test WHERE MATCH(a) AGAINST('databases' IN BOOLEAN MODE)
    

    然后返回两行。

    如果您的应用程序将严重依赖于全文检索,您可能需要考虑更全面的包,如 Lucene/Solr Sphinx