MySQL MATCH AGAINST无效

Ken*_*Ken 7 mysql pattern-matching match

我实际上在一个有两张桌子的网站上工作,几乎完全相同,其中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`);
Run Code Online (Sandbox Code Playgroud)

当我做一个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.');
Run Code Online (Sandbox Code Playgroud)

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

然后当我跑

SELECT * FROM `test` WHERE MATCH (`title`, `body`) AGAINST ('consectetur');
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM `test` WHERE `body` LIKE '%consectetur%';
Run Code Online (Sandbox Code Playgroud)

然后找到一条记录.

虽然我对MySQL有很多经验,但这是我第一次使用MATCH,所以我做了些什么蠢事?为什么这不起作用?是否需要构建索引(我已在表上完成了REPAIR)或者它是否应该自动发生?

仅供参考,工作表定义为

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;
Run Code Online (Sandbox Code Playgroud)

而导致我出现问题并将我送到这条路线的是

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;
Run Code Online (Sandbox Code Playgroud)

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

jch*_*360 8

你需要IN BOOLEAN MODE在最后添加

SELECT * FROM `test` WHERE MATCH (title, body) AGAINST ('Ipsum' IN BOOLEAN MODE);
Run Code Online (Sandbox Code Playgroud)

请看这里:

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


fan*_*nts 5

手册

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

您的表中有两行...