2014-05-23 136 views
2

我創建了一個名爲users表,如下所示:MySQL全文索引的查詢返回錯誤,創建索引

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','[email protected]'), 
('Jon','Test','[email protected]'), 
('Jane','Smith','[email protected]'), 
('Fred','Francis','[email protected]'), 
('Mike','Williams','[email protected]'), 
('Michael','Burke','[email protected]'); 

然而,當我運行:

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

請出示'create table'語句以及用於創建索引的任何其他語句。顯而易見的假設是該指數並不存在。 –

+0

該表最初是從Access文件導入的。這個索引是用MySQL Workbench用以下代碼創建的: 'ALTER TABLE'system'。'user'ADD FULLTEXT INDEX'search'('firstname'ASC);' – Modemmute

+0

基於單引號的使用,我的猜測是該索引從未創建。只對字符串和日期常量使用單引號。 –

回答

3

的問題

你的問題似乎是(從運行你已經發布的代碼)混合起來的列名。您在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','[email protected]'), 
('Jon','Test','[email protected]'), 
('Jane','Smith','[email protected]'), 
('Fred','Francis','[email protected]'), 
('Mike','Williams','[email protected]'), 
('Michael','Burke','[email protected]'); 

所以現在我們有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 [email protected] 
5 Mike Williams [email protected] 
+0

感謝@ Alex.Ritna的精彩和非常詳細的答案!奇怪的底部查詢工作,但它上面沒有。不知何故,只匹配1191錯誤返回的姓氏,但匹配所有三列時,正確的結果會返回。想知道爲什麼姓氏列單獨匹配會導致錯誤? – Modemmute

+1

因爲您在u_namelast列上沒有FULLTEXT索引。在我的例子中,我在這一行中添加了:'ALTER TABLE用戶添加FULLTEXT INDEX搜索(u_namelast ASC);'。即使您在所有3上添加了索引,但並不意味着您可以單獨使用一個列,但沒有明確指定索引。 –

+0

@Modemmute考慮將答案標記爲已接受,如果它符合要求並解決您的問題 –