MySQL 全文检索(Full-Text Search)
全文檢索FTS不同于模糊查詢like,它可以匹配局部的查詢條件,即把原查詢條件做下分詞再去查詢。
比如查詢條件是:food fruit,全文檢索可以做到返回 包含 food fruit,food, fruit, fruit food的結(jié)果集。
不僅如此,MySQL通過Boolean FTS還可以做到查詢結(jié)果包含 food 但不包含 fruit。
MySQL全文檢索概述
目前MySQL支持FULLTEXTindex的存儲(chǔ)引擎是 InnoDB和MyISAM;
FULLTEXT index的column列類型只支持:CHAR, VARCHAR, or TEXT;
FULLTEXT index 只有在查詢語句使用 MATCH() AGAINST()時(shí)候才會(huì)生效;
創(chuàng)建 Full-Text Search
MySQL FTS需要?jiǎng)?chuàng)建 FULLTEXT 類型的 index,index要包含所有想要全文檢索的列。
創(chuàng)建FTS語法:
CREATE TABLE table_name(
column_list,
...,
FULLTEXT (column1,column2,..)
);
ALTER TABLE table_name
ADD FULLTEXT(column_name1, column_name2,…)
CREATE FULLTEXT INDEX index_name
ON table_name(idx_column_name,...)
刪除FTS語法:
ALTER TABLE table_name
DROP INDEX index_name;
創(chuàng)建full-text index 示例:
create fulltext index full_idx_name_author_publisher
on book(name, author, publisher);
MySQL默認(rèn)的 full-text parser 根據(jù)單詞間的空格或空白符來分割單詞的;但這對(duì)于表意語言如中文、韓語和日本語就沒作用了。
為了解決這個(gè)問題,MySQL提供了ngram full-text parser,從5.76開始,MySQL把ngram full-text parser作為server內(nèi)置插件。
create fulltext index full_idx_name_author_publisher
on book(name, author, publisher) WITH PARSER NGRAM;
注意: 實(shí)際使用 ngram parser 的時(shí)候,需要關(guān)注 stopwords,最好自定義相關(guān)語言的 stop word 列表。
MySQL FTS檢索
MySQL全文檢索類型:
natural language search type
boolean search type
query expansion search type
Natural-Language檢索
select * from book
where
match(name, author, publisher) -- 想要匹配的column列表,需要和創(chuàng)建index時(shí)候的column列表一致:列名和個(gè)數(shù)要一樣(順序可以不一樣),不然sql會(huì)報(bào)錯(cuò)。
against('北京日?qǐng)?bào)') -- 關(guān)鍵字
或
select * from book
where
match(publisher,name, author)
against('北京日?qǐng)?bào)' IN NATURAL LANGUAGE MODE);
如果查詢的是中文,創(chuàng)建index的時(shí)候要指定用 ngram parser;
match的column列表需要和創(chuàng)建index時(shí)候的column列表一致:列名和個(gè)數(shù)要一樣(順序可以不一樣),不然sql會(huì)報(bào)錯(cuò);
IN NATURAL LANGUAGE MODE是可選項(xiàng),因?yàn)樗悄J(rèn)檢索類型。
Boolean FTS
select * from book
where
match(publisher,name, author)
against('北京日?qǐng)?bào) -青鳥' IN BOOLEAN MODE);
Boolean操作符:
+: Include, the word must be present.
–: Exclude, the word must not be present.
>: Include, and increase ranking value.
<: Include, and decrease the ranking value.
(): Group words into subexpressions (allowing them to be included, excluded, ranked, and so forth as a group).
~: Negate a word’s ranking value.
*: Wildcard at the end of the word.
“”: Defines a phrase (as opposed to a list of individual words, the entire phrase is matched for inclusion or exclusion).
Query Expansion
select * from book
where
match(publisher,name, author)
against('老舍' WITH QUERY EXPANSION);
先查出匹配關(guān)鍵字的結(jié)果集
從結(jié)果集里獲取相關(guān)詞匯
用相關(guān)詞匯做為條件再次查詢
注意:可能會(huì)查出很多不相關(guān)的結(jié)果。
參考資料
MySQL 5.7 中文全文檢索使用教程
Full-Text Searches in MySQL: The Good, the Bad and the Ugly
MySQL Boolean Full-Text Searches
12.10 Full-Text Search Functions
How to Use Full-Text Searches in My
作者:編碼者頻道
微信公眾號(hào):編碼者頻道
掃描二維碼(或者長(zhǎng)按識(shí)別二維碼)關(guān)注公眾號(hào)獲取最新信息。
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,
轉(zhuǎn)載請(qǐng)保留原文鏈接,謝謝!
總結(jié)
以上是生活随笔為你收集整理的MySQL 全文检索(Full-Text Search)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无线路由器如何设置为内网接入点路由器接入
- 下一篇: 手把手教你如何安装笔记本硬盘如何安装电脑