【问题标题】:MySQL match() against() won't return anythingMySQL match() against() 不会返回任何内容
【发布时间】:2014-08-16 19:40:07
【问题描述】:

第一个查询不返回任何内容,第二个返回 0,第三个对所有记录返回 0。我删除了IN NATURAL LANGUAGE MODE,但没有任何变化。有什么原因吗?

我检查了很多例子,例如:

数据库)

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');

【问题讨论】:

    标签: mysql full-text-search


    【解决方案1】:

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

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

    mysql> SELECT * FROM 文章
    在哪里匹配(标题,正文)
    反对(自然语言模式下的“MySQL”);空集(0.00 秒)

    搜索结果为空,因为 at
    中存在单词“MySQL” 至少 50% 的行,因此被有效地视为停用词。 这种过滤技术更适用于大型数据集,其中 您可能不希望结果集每隔一行从 1GB 表,而不是可能导致结果不佳的小型数据集 流行的术语。

    您可以使用 InnoDB 存储引擎来绕过此功能:

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

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

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

    【讨论】:

    • InnoDB - Error Code: 1214. The used table type doesn't support FULLTEXT indexes
    • 很高兴能为您提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2012-05-22
    • 2012-03-15
    • 2011-11-10
    相关资源
    最近更新 更多