簡體   English   中英

MySQL全文搜索不起作用

[英]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%的門檻會阻止結果出現。

對於MySQL版本5.6+

您只需要添加一個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版本

在MySQL中,早於5.6的版本無法在InnoDB表上定義FULLTEXT INDEX

來自MySQL 5.5文檔

全文索引只能與MyISAM表一起使用。 (在MySQL 5.6及更高版本中,它們也可以與InnoDB表一起使用。)

因此,必須決定使用FOREIGN KEYFULLTEXT INDEX並選擇存儲引擎 - InnoDBMyISAM 由於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM