MySQL全文查询返回错误,创建索引

时间:2014-05-23 02:35:34

标签: mysql sql indexing full-text-search

我创建了一个名为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旗舰版上运行MySQL 5.6.16(x86_64)。

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:3)

问题

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

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