MySQL match()对()不会返回任何内容

时间:2014-08-16 19:40:08

标签: mysql full-text-search

第一个查询不返回任何内容,第二个返回0,第三个返回所有记录的零。我删除了IN NATURAL LANGUAGE MODE但没有更改。有什么理由吗?

我查了很多例子,例如:

DB)

SELECT
*
FROM person
WHERE
MATCH(`name`, `middlename`, `surname`) AGAINST ('John' IN NATURAL LANGUAGE MODE);


SELECT
COUNT(*)
FROM person
WHERE
MATCH(`name`, `middlename`, `surname`) AGAINST ('John' IN NATURAL LANGUAGE MODE);


SELECT
id,
MATCH(`name`, `middlename`, `surname`) AGAINST ('John' IN NATURAL LANGUAGE MODE) AS score
FROM person
ORDER BY score DESC;


DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `middlename` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `surname` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `code` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT(`name`,`middlename`,`surname`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


INSERT INTO `person` (`name`, `middlename`, `surname`, `code`) VALUES
('John', 'Joseph', 'Travolta', 'JJT'),
('John', '', 'Lenon', 'JL'),
('John', '', 'Wayne', 'JW'),
('John', 'Paul', 'John', 'JPJ'),
('Robert', '', 'DeNiro', 'RD'),
('Elton', '', 'John', 'EJ'),
('Abi', 'John John', '', 'AJ'),
('Johny', '', '', 'J'),
('John', 'John', 'John', 'JJJ');

1 个答案:

答案 0 :(得分:4)

记录了这个结果。您正在使用MyISAM表,并且您的关键字“John”至少存在于50%的行中,因此是一个停用词,请参阅manual, Natural Language Full-Text Searches

  

MyISAM限制对于非常小的表,单词分配不会   充分反映其语义价值,有时可能会出现这种模式   在MyISAM表上为搜索索引生成奇怪的结果。对于   例如,虽然“MySQL”这个词出现在每一行中   前面显示的文章表,在MyISAM搜索中搜索单词   index不会产生任何结果:

     

的MySQL> SELECT * FROM articles
      比赛(标题,正文)
      反对('MySQL'自然语言模式);空集(0.00秒)

     

搜索结果为空,因为“MySQL”字样出现在   至少50%的行,因此被有效地视为一个禁用词。   这种过滤技术更适合大数据集,其中   您可能不希望结果集从a返回每隔一行   1GB表,而不是可能导致效果不佳的小数据集   对于流行的术语。

您可以使用InnoDB存储引擎来解决此问题:

  

当您第一次尝试全文时,50%的阈值会让您感到惊讶   搜索它是如何工作的,并使InnoDB表更适合   实验全文搜索。

另一种可能性是使用Boolean Full-Text Searches

  

他们不使用适用于MyISAM搜索索引的50%阈值。