【问题标题】:MySQL MATCH AGAINST not workingMySQL MATCH AGAINST 不工作
【发布时间】:2013-01-24 08:51:55
【问题描述】:

我实际上在一个网站上工作,其中有两个表,几乎相同,其中 MATCH AGAINST 可以在一个上工作,但不能在另一个上工作。为了找出为什么我试图将其简化为简单的“让我们做一个简单的表格工作” - 但事实并非如此。

我正在使用 phpMyAdmin 进行测试,这是 MySQL 5.1.41。

我构建的测试使用以下来定义表...

CREATE TABLE IF NOT EXISTS `test` (
  `id` int(11) NOT NULL,
  `title` text NOT NULL,
  `body` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

ALTER TABLE `test` ADD FULLTEXT (`title`, `body`);

当我进行 SHOW INDEX FROM 测试时,我看到有一个包含标题和正文的 FULLTEXT 键。

我插入了几行

INSERT INTO `test` (`id`, `title`, `body`) VALUES 
('1', 'Lorem Ipsum', 'Lorem ipsum dolor sit amet, consectetur ... lacus porta euismod.'), 
('2', 'Lorem Ipsum (cont)', 'Nunc leo massa, vulputate ... euismod fringilla.');

(为简洁起见,删除了一些正文内容)

然后当我跑步时

SELECT * FROM `test` WHERE MATCH (`title`, `body`) AGAINST ('consectetur');

我得到一个空的结果集 - 没有找到行,但如果我运行

SELECT * FROM `test` WHERE `body` LIKE '%consectetur%';

然后找到一条记录。

虽然我对 MySQL 有很多经验,但这是我第一次使用 MATCH,所以我在做一些愚蠢的事情吗?为什么这不起作用?是否需要构建索引(我已经对表进行了修复)还是应该自动进行?

仅供参考,使用的表定义为

CREATE TABLE IF NOT EXISTS `web_pages1` (
  `id` int(11) NOT NULL,
  `title` varchar(255) DEFAULT NULL,
  `slug` varchar(255) DEFAULT NULL,
  `meta_keywords` text,
  `meta_description` text,
  `snippet` text,
  `body` mediumtext,
  `created_by` int(11) DEFAULT NULL,
  `date_created` datetime DEFAULT NULL,
  `date_published` date DEFAULT NULL,
  `author` varchar(255) DEFAULT NULL,
  `edited_by` int(11) DEFAULT NULL,
  `date_edited` datetime DEFAULT NULL,
  `status` tinyint(4) NOT NULL DEFAULT '1',
  `parent_id` tinyint(11) DEFAULT NULL,
  `menu_id` int(11) DEFAULT NULL,
  `short_name` varchar(255) DEFAULT NULL,
  `sort_order` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `search` (`title`,`slug`,`meta_keywords`,`meta_description`,`snippet`,`body`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

导致我出现问题并让我走这条路的人是

CREATE TABLE IF NOT EXISTS `web_news1` (
  `id` int(11) NOT NULL,
  `title` varchar(255) NOT NULL,
  `slug` varchar(255) NOT NULL,
  `meta_keywords` text,
  `meta_description` text,
  `snippet` text NOT NULL,
  `body` text NOT NULL,
  `created_by` int(11) NOT NULL,
  `date_created` datetime NOT NULL,
  `date_published` date DEFAULT NULL,
  `author` varchar(255) DEFAULT NULL,
  `edited_by` int(11) DEFAULT NULL,
  `date_edited` datetime DEFAULT NULL,
  `status` tinyint(4) DEFAULT '0',
  PRIMARY KEY (`id`),
  FULLTEXT KEY `search` (`title`,`slug`,`meta_keywords`,`meta_description`,`snippet`,`body`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

虽然我已经尝试将第二个定义为与第一个完全相同,但它仍然不起作用。

【问题讨论】:

    标签: mysql pattern-matching match


    【解决方案1】:

    你需要在末尾添加IN BOOLEAN MODE

    SELECT * FROM `test` WHERE MATCH (title, body) AGAINST ('Ipsum' IN BOOLEAN MODE);
    

    请看这里:

    http://www.sqlfiddle.com/#!2/1b80b/2

    【讨论】:

      【解决方案2】:

      来自manual

      搜索结果为空,因为单词“whatever”出现在 至少 50% 的行。因此,它被有效地视为 停用词。对于大型数据集,这是最理想的行为:A 自然语言查询不应从 1GB 中每隔一行返回一次 桌子。对于小型数据集,它可能不太理想。

      您的表格中有两行...

      【讨论】:

      • 我错过了那一点!但是,我正在搜索的表可能只有少量行(目前只有 1 行,并且该站点处于活动状态)所以我需要返回匹配项,即使它可能是(在这种情况下)表中的每一行!
      猜你喜欢
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 2016-11-01
      • 2011-09-23
      相关资源
      最近更新 更多