[英]MySQL fulltext search does not work
我有一個像這樣結構的MySQL表:
$sql = "CREATE TABLE test(
id INT NOT NULL,
title VARCHAR(512) NOT NULL COLLATE utf8_general_ci,
body TEXT NOT NULL COLLATE utf8_general_ci,
dateStored VARCHAR(32) NOT NULL COLLATE utf8_general_ci,
fileName VARCHAR(128) NOT NULL COLLATE utf8_general_ci,
FOREIGN KEY(id) REFERENCES `database`.`parent`(id)
);";
我的存儲引擎是MYISAM。
現在,當我想用MATCH
- AGAINST
搜索body
字段時,沒有結果......
這是我的嘗試:
$sql2 = "SELECT * FROM database.test
WHERE MATCH(body) AGAINST('?')";
$prepare = $pdo->prepare($sql2);
$prepare->execute( array( $pattern ) );
$fetch = $prepare->fetchAll();
它看起來很基本,但我的代碼仍然不起作用。 你能告訴我我的代碼有什么問題嗎?
這是因為我有一個字段引用另一個表嗎?
添加更多數據。 默認情況下,MySQL將忽略表中50%或更多行中的任何單詞,因為它認為它是一個“噪聲”單詞。
如果表中的行數非常少,通常會經常達到這個50%的限制(即,如果你有兩行,那么每個單詞至少占行數的50%!)。
我認為你錯過了你的領域的FULLTEXT
索引。 您需要在列上具有FULLTEXT索引才能執行MATCH AGAINST
搜索。
使用表聲明FULLTEXT
索引或更改當前表以包含索引。
ALTER TABLE `test` ADD FULLTEXT (`body`)
此外,正如其他一些人所說的那樣,字長有一個截止,還有50%的門檻會阻止結果出現。
您只需要添加一個FULLTEXT INDEX
來改變Crackertastic所描述的表,或者直接在CREATE TABLE
語句中定義它。
這是一個工作示例:
-- DROP TABLE child;
-- DROP TABLE parent;
CREATE TABLE parent (
id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB; -- or MyISAM
CREATE TABLE child(
id INT NOT NULL,
title VARCHAR(512) NOT NULL COLLATE utf8_general_ci,
body TEXT NOT NULL COLLATE utf8_general_ci,
date_stored VARCHAR(32) NOT NULL COLLATE utf8_general_ci,
file_name VARCHAR(128) NOT NULL COLLATE utf8_general_ci,
parent_id INT NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (parent_id) REFERENCES parent(id),
FULLTEXT (body)
) ENGINE=InnoDB; -- or MyISAM
INSERT INTO child (id, title, body, date_stored, file_name, parent_id) VALUES('1','test title 1','test body 1','22.05.2014','file1.txt',5);
INSERT INTO child (id, title, body, date_stored, file_name, parent_id) VALUES('2','asd','qwer','31.07.2019','yxcv.txt',6);
INSERT INTO child (id, title, body, date_stored, file_name, parent_id) VALUES('3','gfdsa','trewq','21.04.2015','hjkl.txt',7);
SELECT
*
FROM
child
WHERE
MATCH(body) AGAINST('qwer')
;
SELECT
請求返回id = 2
的條目。
在MySQL中,早於5.6的版本無法在InnoDB
表上定義FULLTEXT INDEX
。
來自MySQL 5.5文檔 :
全文索引只能與
MyISAM
表一起使用。 (在MySQL 5.6及更高版本中,它們也可以與InnoDB
表一起使用。)
因此,必須決定使用FOREIGN KEY
和FULLTEXT INDEX
並選擇存儲引擎 - InnoDB
或MyISAM
。 由於InnoDB
支持FOREIGN KEY
約束,但不支持FULLTEXT
索引。
嘗試在InnoDB
表上創建FULLTEXT INDEX
-- DROP TABLE child;
-- DROP TABLE parent;
CREATE TABLE parent (
id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
CREATE TABLE child(
id INT NOT NULL,
title VARCHAR(512) NOT NULL COLLATE utf8_general_ci,
body TEXT NOT NULL COLLATE utf8_general_ci,
date_stored VARCHAR(32) NOT NULL COLLATE utf8_general_ci,
file_name VARCHAR(128) NOT NULL COLLATE utf8_general_ci,
parent_id INT NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (parent_id) REFERENCES parent(id)
) ENGINE=InnoDB;
ALTER TABLE `child` ADD FULLTEXT (`body`);
失敗並出現錯誤:
Query: ALTER TABLE `child` ADD FULLTEXT (`body`)
Error Code: 1214
The used table type doesn't support FULLTEXT indexes
所以,你必須使用MyISAM
for FULLTEXT INDEX
。 然后你只需要像Crackertastic所描述的那樣添加一個改變表的FULLTEXT INDEX
,或者直接在CREATE TABLE
語句中定義它。
這是一個工作示例:
-- DROP TABLE child;
-- DROP TABLE parent;
CREATE TABLE parent (
id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM;
CREATE TABLE child(
id INT NOT NULL,
title VARCHAR(512) NOT NULL COLLATE utf8_general_ci,
body TEXT NOT NULL COLLATE utf8_general_ci,
date_stored VARCHAR(32) NOT NULL COLLATE utf8_general_ci,
file_name VARCHAR(128) NOT NULL COLLATE utf8_general_ci,
parent_id INT NOT NULL,
PRIMARY KEY (id),
FULLTEXT (body)
) ENGINE=MyISAM;
INSERT INTO child (id, title, body, date_stored, file_name, parent_id) VALUES('1','test title 1','test body 1','22.05.2014','file1.txt',5);
INSERT INTO child (id, title, body, date_stored, file_name, parent_id) VALUES('2','asd','qwer','31.07.2019','yxcv.txt',6);
INSERT INTO child (id, title, body, date_stored, file_name, parent_id) VALUES('3','gfdsa','trewq','21.04.2015','hjkl.txt',7);
SELECT
*
FROM
child
WHERE
MATCH(body) AGAINST('qwer')
;
SELECT
請求返回id = 2
的條目。
嘗試IN BOOLEAN MODE。 這不會忽略任何行。
http://dev.mysql.com/doc/refman/5.6/en/fulltext-boolean.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.