mysql全文模糊搜索MATCH AGAINST方法示例
mysql 4.x以上提供了全文檢索支持 MATCH ……AGAINST 模式(不區(qū)分大小寫)
建立全文索引的表的存儲引擎類型必須為MyISAM
問題是match against對中文模糊搜索支持不是太好
新建一個utf8 MyISAM類型的表并建立一個全文索引 :
CREATE TABLE articles ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT, FULLTEXT (title,body) ) ENGINE=MyISAM DEFAULT >
其中FULLTEXT(title, body) 給title和body這兩列建立全文索引,之后檢索的時候注意必須同時指定這兩列。
給這個表添加點(diǎn)測試數(shù)據(jù)
INSERT INTO articles (title,body) VALUES ('MySQL Tutorial','DBMS stands for DataBase ...'), ('How To Use MySQL Well','After you went through a ...'), ('Optimizing MySQL','In this tutorial we will show ...'), ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), ('MySQL vs. YourSQL','In the following database comparison ...'), ('MySQL Security','When configured properly, MySQL ...');
全文檢索測試
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database');
注意 MATCH (title,body) 里面的值必須是前面建立全文索引的兩個字段不能少。
mysql 默認(rèn)支持全文檢索的字符長度是4,可以用SHOW VARIABLES LIKE 'ft_min_word_len' 來查看指定的字符長度,也可以在mysql配置文件my.ini 更改最小字符長度,方法是在my.ini 增加一行 比如:ft_min_word_len = 2,改完后重啟mysql即可。
另外,MySQL還會計算一個詞的權(quán)值,以決定是否出現(xiàn)在結(jié)果集中,具體如下:
mysql在集和查詢中的對每個合適的詞都會先計算它們的權(quán)重,一個出現(xiàn)在多個文檔中的詞將有較低的權(quán)重(可能甚至有一個零權(quán)重),因?yàn)樵谶@個特定的集中,它有較低的語義值。否則,如果詞是較少的,它將得到一個較高的權(quán)重,mysql默認(rèn)的閥值是50%,上面‘you'在每個文檔都出現(xiàn),因此是100%,只有低于50%的才會出現(xiàn)在結(jié)果集中。
全文檢索語法
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+apple -banana' IN BOOLEAN MODE);
表示AND,即必須包含。- 表示NOT,即不包含。
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('apple banana' IN BOOLEAN MODE);
apple和banana之間是空格,空格表示OR,即至少包含apple、banana中的一個。
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+apple banana' IN BOOLEAN MODE);
必須包含apple,但是如果同時也包含banana則會獲得更高的權(quán)重。
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+apple ~banana' IN BOOLEAN MODE);
~ 是我們熟悉的異或運(yùn)算符。返回的記錄必須包含apple,但是如果同時也包含banana會降低權(quán)重。 但是它沒有 +apple -banana 嚴(yán)格,因?yàn)楹笳呷绻琤anana壓根就不返回。
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+apple +(>banana <orange)' IN BOOLEAN MODE);
返回同時包含apple和banana或者同時包含apple和orange的記錄。但是同時包含apple和banana的記錄的權(quán)重高于同時包含apple和orange的記錄。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
mysql8.0.23 linux(centos7)安裝完整超詳細(xì)教程
這篇文章主要介紹了mysql8.0.23 linux(centos7)安裝完整超詳細(xì)教程,本文給介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01Mysql中zerofill自動填充的實(shí)現(xiàn)
MySQL中的zero fill可以設(shè)置自動填充零,以便固定位數(shù)的數(shù)字能夠保持一致的格式,本文就介紹了Mysql中zerofill自動填充,感興趣的可以了解一下2023-09-09MySQL 存儲過程傳參數(shù)實(shí)現(xiàn)where id in(1,2,3,...)示例
一個MySQL 存儲過程傳參數(shù)的問題想實(shí)現(xiàn)例如篩選條件為:where id in(1,2,3,...),下面有個不錯的示例,感興趣的朋友可以參考下2013-10-10MySql狀態(tài)查看方法 MySql如何查看連接數(shù)和狀態(tài)?
如果是root帳號,你能看到所有用戶的當(dāng)前連接。如果是其它普通帳號,只能看到自己占用的連接2012-11-11MYSQL8 通過ibd文件恢復(fù)表數(shù)據(jù)的方法
這篇文章主要介紹了MYSQL8 通過ibd文件恢復(fù)表數(shù)據(jù)的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01mysql提示got timeout reading communication packets的解決方法
今天發(fā)現(xiàn)mysql錯誤日志中出現(xiàn)got timeout reading communication packets,一般情況因?yàn)椴糠猪撁嫔捎袉栴}導(dǎo)致,這里簡單分享一下解決方法2019-05-05一種簡單的ID生成策略: Mysql表生成全局唯一ID的實(shí)現(xiàn)
這篇文章主要介紹了一種簡單的ID生成策略: Mysql表生成全局唯一ID的實(shí)現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11