【问题标题】:MySQL Fulltext Query Returning Error, Index CreatedMySQL全文查询返回错误,已创建索引
【发布时间】:2014-05-23 02:35:34
【问题描述】:

我创建了一个名为users的表,如下:

CREATE TABLE users (
   u_id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
   u_namefirst VARCHAR(100),
   u_namelast VARCHAR(100),
   u_email VARCHAR(100),
   FULLTEXT (u_namefirst, u_namelast, u_email)
) ENGINE=MyISAM;

并用数据填充它:

INSERT INTO users (u_namefirst, u_namelast, u_email) VALUES
('Michael','Williams','williams@williams.com'),
('Jon','Test','test@test.com'),
('Jane','Smith','smith@smith.com'),
('Fred','Francis','fred@fred.com'),
('Mike','Williams','mike@williams.com'),
('Michael','Burke','michael@burke.com');

然而,当我跑步时:

SELECT *
FROM users
WHERE MATCH ( u_namelast ) AGAINST ( 'williams');

我得到:“错误代码:1191。找不到与列列表匹配的 FULLTEXT 索引”。索引肯定存在,它的类型肯定是全文。已为该索引选择了正确的列。

我尝试同时运行 InnoDB 和 MyISAM 引擎,得到了相同的结果。作为测试,当我将最后一行换成WHERE u_namefirst = 'michael' 时,我得到了正确的结果——所以我不认为这是现有数据的问题。

我在 Windows 7 Ultimate 上运行 MySQL 5.6.16 (x86_64)。

任何帮助表示赞赏!

【问题讨论】:

  • 请显示create table 语句和用于创建索引的任何其他语句。显而易见的假设是该索引并不真正存在。
  • 该表最初是从 Access 文件中导入的。该索引是使用 MySQL Workbench 创建的,代码如下:ALTER TABLE 'system'.'user' ADD FULLTEXT INDEX 'search' ('firstname' ASC);
  • 我的猜测是,基于单引号的使用,该索引从未创建过。仅对字符串和日期常量使用单引号。
  • 在 MySQL 中使用反引号引用表名和列名。
  • 我删除了索引并重新创建了它,如下所示:ALTER TABLE user ADD FULLTEXT INDEX search ( firstname ASC );(没有单引号,如建议的那样)。这成功创建了索引,但是当我匹配时仍然出现 1191 错误消息。它是从 Access 导入的这一事实是否会导致任何问题?

标签: mysql sql indexing full-text-search


【解决方案1】:

问题

您的问题似乎是(通过运行您发布的代码)混淆了列名。您在firstname 列上添加了FULLTEXT INDEX

ALTER TABLE user ADD FULLTEXT INDEX search ( firstname ASC );

然后,当您查询时,您搜索的是姓氏字段没有索引

SELECT *
FROM users
WHERE MATCH ( u_namelast ) AGAINST ( 'williams');

解决方案

索引正确的列或查询正确的列都可以正常工作。请务必使用正确的引擎 (MyISAM)。你可以read more about FULLTEXT indexes with MyISAM on the MySQL documentation site

示例

使用下面的示例代码,我为您提供了一些可行的选项,我已经包含了 ALTER TABLE 行,因此您可以看到该方法也可以正常工作。

CREATE TABLE users (
   u_id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
   u_namefirst VARCHAR(100),
   u_namelast VARCHAR(100),
   u_email VARCHAR(100),
   FULLTEXT (u_namefirst, u_namelast, u_email)
) ENGINE=MyISAM;

ALTER TABLE users ADD FULLTEXT INDEX search ( u_namelast ASC );

INSERT INTO users (u_namefirst, u_namelast, u_email) VALUES
('Michael','Williams','williams@williams.com'),
('Jon','Test','test@test.com'),
('Jane','Smith','smith@smith.com'),
('Fred','Francis','fred@fred.com'),
('Mike','Williams','mike@williams.com'),
('Michael','Burke','michael@burke.com');

所以现在我们有一个关于u_namefirst, u_namelast, u_email 的索引和一个只有一个u_namelast

您可以查询单个索引

SELECT *
FROM users
WHERE MATCH (u_namelast) AGAINST ('Williams');

或查询具有多个字段的字段

SELECT *
FROM users
WHERE MATCH (u_namefirst, u_namelast, u_email) AGAINST ('Williams');

两者都应该给你以下结果

1   Michael Williams    williams@williams.com
5   Mike    Williams    mike@williams.com

【讨论】:

  • 感谢@Alex.Ritna 的精彩且非常详细的回答!奇怪的是,底部查询有效,但上面的查询无效。不知何故,仅匹配姓氏时会返回 1191 错误,但在匹配所有三列时会返回正确的结果。关于为什么单独匹配时姓氏列会导致错误的任何想法?
  • 因为您在 u_namelast 列上没有 FULLTEXT 索引。在我的示例中,我在这一行添加了:ALTER TABLE users ADD FULLTEXT INDEX search ( u_namelast ASC );。即使您为所有 3 个添加了索引,但这并不意味着您可以单独使用一列,但仍然没有明确的索引。
  • @Modemmute 如果答案符合要求并解决了您的问题,请考虑将其标记为已接受
  • 再次感谢@Alex.Ritna!这就是答案!
猜你喜欢
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 2014-08-19
  • 2012-03-20
  • 2021-09-04
  • 1970-01-01
相关资源
最近更新 更多