在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

MySQL5.6 InnoDB支持全文檢索

jf_ro2CN3Fa ? 來源:稀土掘金 ? 作者:_沸羊羊 ? 2022-11-12 15:14 ? 次閱讀

前言

我們都知道 InnoDB 在模糊查詢數(shù)據(jù)時使用 "%xx" 會導致索引失效,但有時需求就是如此,類似這樣的需求還有很多,例如,搜索引擎需要根基用戶數(shù)據(jù)的關鍵字進行全文查找,電子商務網(wǎng)站需要根據(jù)用戶的查詢條件,在可能需要在商品的詳細介紹中進行查找,這些都不是B+樹索引能很好完成的工作。

通過數(shù)值比較,范圍過濾等就可以完成絕大多數(shù)我們需要的查詢了。但是,如果希望通過關鍵字的匹配來進行查詢過濾,那么就需要基于相似度的查詢,而不是原來的精確數(shù)值比較,全文索引就是為這種場景設計的。

全文索引(Full-Text Search)是將存儲于數(shù)據(jù)庫中的整本書或整篇文章中的任意信息查找出來的技術。它可以根據(jù)需要獲得全文中有關章、節(jié)、段、句、詞等信息,也可以進行各種統(tǒng)計和分析。

在早期的 MySQL 中,InnoDB 并不支持全文檢索技術,從 MySQL 5.6 開始,InnoDB 開始支持全文檢索。

基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權限、多租戶、數(shù)據(jù)權限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

視頻教程:https://doc.iocoder.cn/video/

倒排索引

全文檢索通常使用倒排索引(inverted index)來實現(xiàn),倒排索引同 B+Tree 一樣,也是一種索引結(jié)構。它在輔助表中存儲了單詞與單詞自身在一個或多個文檔中所在位置之間的映射,這通常利用關聯(lián)數(shù)組實現(xiàn),擁有兩種表現(xiàn)形式:

inverted file index:{單詞,單詞所在文檔的id}

full inverted index:{單詞,(單詞所在文檔的id,再具體文檔中的位置)}

9ebc324c-5c4e-11ed-a3b6-dac502259ad0.png倒排索引

上圖為 inverted file index 關聯(lián)數(shù)組,可以看到其中單詞"code"存在于文檔1,4中,這樣存儲再進行全文查詢就簡單了,可以直接根據(jù) Documents 得到包含查詢關鍵字的文檔;而 full inverted index 存儲的是對,即(DocumentId,Position),因此其存儲的倒排索引如下圖,如關鍵字"code"存在于文檔1的第6個單詞和文檔4的第8個單詞。

相比之下,full inverted index 占用了更多的空間,但是能更好的定位數(shù)據(jù),并擴充一些其他搜索特性。

9ec8b8d2-5c4e-11ed-a3b6-dac502259ad0.png搜索特性

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權限、多租戶、數(shù)據(jù)權限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://gitee.com/zhijiantianya/yudao-cloud

視頻教程:https://doc.iocoder.cn/video/

全文檢索

創(chuàng)建全文索引

「1、創(chuàng)建表時創(chuàng)建全文索引語法如下:」

CREATETABLEtable_name(
idINTUNSIGNEDAUTO_INCREMENTNOTNULLPRIMARYKEY,
authorVARCHAR(200),
titleVARCHAR(200),
contentTEXT(500),
FULLTEXTfull_index_name(author,title,content)
)ENGINE=InnoDB;

輸入查詢語句:

SELECTtable_id,name,space
fromINFORMATION_SCHEMA.INNODB_TABLES
WHEREnameLIKE'test/%';
9ecfa980-5c4e-11ed-a3b6-dac502259ad0.png輔助索引表

上述六個索引表構成倒排索引,稱為輔助索引表。當傳入的文檔被標記化時,單個詞與位置信息和關聯(lián)的DOC_ID,根據(jù)單詞的第一個字符的字符集排序權重,在六個索引表中對單詞進行完全排序和分區(qū)。

「2、在已創(chuàng)建的表上創(chuàng)建全文索引語法如下:」

CREATEFULLTEXTINDEXfull_index_nameONtable_name(col_name);

使用全文索引

MySQL 數(shù)據(jù)庫支持全文檢索的查詢,全文索引只能在 InnoDB 或 MyISAM 的表上使用,并且只能用于創(chuàng)建 char,varchar,text 類型的列。

其語法如下:

MATCH(col1,col2,...)AGAINST(expr[search_modifier])
search_modifier:
{
INNATURALLANGUAGEMODE
|INNATURALLANGUAGEMODEWITHQUERYEXPANSION
|INBOOLEANMODE
|WITHQUERYEXPANSION
}

全文搜索使用 MATCH() AGAINST()語法進行,其中,MATCH() 采用逗號分隔的列表,命名要搜索的列。AGAINST()接收一個要搜索的字符串,以及一個要執(zhí)行的搜索類型的可選修飾符。

全文檢索分為三種類型:自然語言搜索、布爾搜索、查詢擴展搜索,下面將對各種查詢模式進行介紹。

Natural Language

自然語言搜索將搜索字符串解釋為自然人類語言中的短語,MATCH()默認采用 Natural Language 模式,其表示查詢帶有指定關鍵字的文檔。

接下來結(jié)合demo來更好的理解Natural Language

SELECT
count(*)AScount
FROM
`fts_articles`
WHERE
MATCH(title,body)AGAINST('MySQL');

9ef502ca-5c4e-11ed-a3b6-dac502259ad0.pngNatural Language

上述語句,查詢 title,body 列中包含 'MySQL' 關鍵字的行數(shù)量。上述語句還可以這樣寫:

SELECT
count(IF(MATCH(title,body)
against('MySQL'),1,NULL))AScount
FROM
`fts_articles`;

上述兩種語句雖然得到的結(jié)果是一樣的,但從內(nèi)部運行來看,第二句SQL的執(zhí)行速度更快些,因為第一句SQL(基于where索引查詢的方式)還需要進行相關性的排序統(tǒng)計,而第二種方式是不需要的。

還可以通過SQL語句查詢相關性:

SELECT
*,
MATCH(title,body)against('MySQL')ASRelevance
FROM
fts_articles;
9efa8f6a-5c4e-11ed-a3b6-dac502259ad0.png

SQL語句查詢相關性

相關性的計算依據(jù)以下四個條件:

word 是否在文檔中出現(xiàn)

word 在文檔中出現(xiàn)的次數(shù)

word 在索引列中的數(shù)量

多少個文檔包含該 word

對于 InnoDB 存儲引擎的全文檢索,還需要考慮以下的因素:

查詢的 word 在 stopword 列中,忽略該字符串的查詢

查詢的 word 的字符長度是否在區(qū)間 [innodb_ft_min_token_size,innodb_ft_max_token_size] 內(nèi)

如果詞在 stopword 中,則不對該詞進行查詢,如對 'for' 這個詞進行查詢,結(jié)果如下所示:

SELECT
*,
MATCH(title,body)against('for')ASRelevance
FROM
fts_articles;
9f0cd526-5c4e-11ed-a3b6-dac502259ad0.png

InnoDB 存儲引擎的全文檢索

可以看到,'for'雖然在文檔 2,4中出現(xiàn),但由于其是 stopword ,故其相關性為0

參數(shù) innodb_ft_min_token_size 和 innodb_ft_max_token_size 控制 InnoDB 引擎查詢字符的長度,當長度小于 innodb_ft_min_token_size 或者長度大于 innodb_ft_max_token_size 時,會忽略該詞的搜索。

在 InnoDB 引擎中,參數(shù) innodb_ft_min_token_size 的默認值是3,innodb_ft_max_token_size的默認值是84

Boolean

布爾搜索使用特殊查詢語言的規(guī)則來解釋搜索字符串,該字符串包含要搜索的詞,它還可以包含指定要求的運算符,例如匹配行中必須存在或不存在某個詞,或者它的權重應高于或低于通常情況。

例如,下面的語句要求查詢有字符串"Pease"但沒有"hot"的文檔,其中+和-分別表示單詞必須存在,或者一定不存在。

select*fromfts_testwhereMATCH(content)AGAINST('+Pease-hot'INBOOLEANMODE);

「Boolean 全文檢索支持的類型包括:」

+:表示該 word 必須存在

-:表示該 word 必須不存在

(no operator)表示該 word 是可選的,但是如果出現(xiàn),其相關性會更高

@distance表示查詢的多個單詞之間的距離是否在 distance 之內(nèi),distance 的單位是字節(jié),這種全文檢索的查詢也稱為 Proximity Search,如 MATCH(context) AGAINST('"Pease hot"[@30](https://my.oschina.net/u/3380933)' IN BOOLEAN MODE)語句表示字符串 Pease 和 hot 之間的距離需在30字節(jié)內(nèi)

>:表示出現(xiàn)該單詞時增加相關性

<:表示出現(xiàn)該單詞時降低相關性

~:表示允許出現(xiàn)該單詞,但出現(xiàn)時相關性為負

* :表示以該單詞開頭的單詞,如 lik*,表示可以是 lik,like,likes

" :表示短語

下面是一些demo,看看 Boolean Mode 是如何使用的。

「demo1:+ -」

SELECT
*
FROM
`fts_articles`
WHERE
MATCH(title,body)AGAINST('+MySQL-YourSQL'INBOOLEANMODE);

上述語句,查詢的是包含 'MySQL' 但不包含 'YourSQL' 的信息

9f1a0246-5c4e-11ed-a3b6-dac502259ad0.png

Boolean Mode

「demo2:no operator」

SELECT
*
FROM
`fts_articles`
WHERE
MATCH(title,body)AGAINST('MySQLIBM'INBOOLEANMODE);

上述語句,查詢的 'MySQL IBM' 沒有 '+','-'的標識,代表 word 是可選的,如果出現(xiàn),其相關性會更高。

9f279b0e-5c4e-11ed-a3b6-dac502259ad0.png

相關性

「demo3:@」

SELECT
*
FROM
`fts_articles`
WHERE
MATCH(title,body)AGAINST('"DB2IBM"@3'INBOOLEANMODE);

上述語句,代表 "DB2" ,"IBM"兩個詞之間的距離在3字節(jié)之內(nèi)

9f5192d8-5c4e-11ed-a3b6-dac502259ad0.png

「demo4:> <」

SELECT
*
FROM
`fts_articles`
WHERE
MATCH(title,body)AGAINST('+MySQL+(>database

上述語句,查詢同時包含 'MySQL','database','DBMS' 的行信息,但不包含'DBMS'的行的相關性高于包含'DBMS'的行。

9f56f912-5c4e-11ed-a3b6-dac502259ad0.png

相關性

「demo5: ~」

SELECT
*
FROM
`fts_articles`
WHERE
MATCH(title,body)AGAINST('MySQL~database'INBOOLEANMODE);

上述語句,查詢包含 'MySQL' 的行,但如果該行同時包含 'database',則降低相關性。

9f5d09ec-5c4e-11ed-a3b6-dac502259ad0.png

降低相關性

「demo6:」 *

SELECT
*
FROM
`fts_articles`
WHERE
MATCH(title,body)AGAINST('My*'INBOOLEANMODE);

上述語句,查詢關鍵字中包含'My'的行信息。

9f69b200-5c4e-11ed-a3b6-dac502259ad0.png

「demo7:"」

SELECT
*
FROM
`fts_articles`
WHERE
MATCH(title,body)AGAINST('"MySQLSecurity"'INBOOLEANMODE);

上述語句,查詢包含確切短語 'MySQL Security' 的行信息。

9f735620-5c4e-11ed-a3b6-dac502259ad0.png

Query Expansion

查詢擴展搜索是對自然語言搜索的修改,這種查詢通常在查詢的關鍵詞太短,用戶需要 implied knowledge(隱含知識)時進行,例如,對于單詞 database 的查詢,用戶可能希望查詢的不僅僅是包含 database 的文檔,可能還指那些包含 MySQL、Oracle、RDBMS 的單詞,而這時可以使用 Query Expansion 模式來開啟全文檢索的 implied knowledge

通過在查詢語句中添加 WITH QUERY EXPANSION / IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION 可以開啟 blind query expansion(又稱為 automatic relevance feedback),該查詢分為兩個階段。

第一階段:根據(jù)搜索的單詞進行全文索引查詢

第二階段:根據(jù)第一階段產(chǎn)生的分詞再進行一次全文檢索的查詢

接著來看一個例子,看看 Query Expansion 是如何使用的。

--創(chuàng)建索引
createFULLTEXTINDEXtitle_body_indexonfts_articles(title,body);
--使用NaturalLanguage模式查詢
SELECT
*
FROM
`fts_articles`
WHERE
MATCH(title,body)AGAINST('database');

使用 Natural Language 查詢結(jié)果如下:

9f9943e4-5c4e-11ed-a3b6-dac502259ad0.png

Natural Language 查詢結(jié)果

--當使用QueryExpansion模式查詢
SELECT
*
FROM
`fts_articles`
WHERE
MATCH(title,body)AGAINST('database'WITHQUERYexpansion);

使用 Query Expansion 后查詢結(jié)果如下:

9fbe6c1e-5c4e-11ed-a3b6-dac502259ad0.png

Query Expansion 后查詢結(jié)果

由于 Query Expansion 的全文檢索可能帶來許多非相關性的查詢,因此在使用時,用戶可能需要非常謹慎。

刪除全文索引

「1、直接刪除全文索引語法如下:」

DROPINDEXfull_idx_nameONdb_name.table_name;

「2、使用 alter table 刪除全文索引語法如下:」

ALTERTABLEdb_name.table_nameDROPINDEXfull_idx_name;

小結(jié)

本文從理論與實踐結(jié)合的角度對 fulltext index 做了介紹。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • IBM
    IBM
    +關注

    關注

    3

    文章

    1757

    瀏覽量

    74698
  • MySQL
    +關注

    關注

    1

    文章

    809

    瀏覽量

    26569
  • RBAC
    +關注

    關注

    0

    文章

    44

    瀏覽量

    9970

原文標題:MySQL 模糊查詢再也不用like+%了

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    使用mysql出現(xiàn)Access denied for user 'root'@'localhost' (us,請問如何解決?

    ; 如果MySql5.6操作時報錯: You must SET PASSWORD before executing this statement 請執(zhí)行下面的命令解決: mysql>SET
    發(fā)表于 07-03 03:07

    使用mysql的時出現(xiàn)Access denied for user 'root'@'localhost' (us錯誤,請問這是為什么?如何解決?

    ; 如果MySql5.6操作時報錯: You must SET PASSWORD before executing this statement 請執(zhí)行下面的命令解決: mysql>SET
    發(fā)表于 07-09 09:29

    使用docker安裝的mysql5.6實例的恢復方法

    2018-12-23 從aliyun的drs全備恢復數(shù)據(jù)庫到docker的mysql
    發(fā)表于 03-14 11:26

    詳解Mysql數(shù)據(jù)庫InnoDB存儲引擎事務

    關于Mysql數(shù)據(jù)庫InnoDB存儲引擎事務的一點理解
    發(fā)表于 05-13 10:11

    InnoDB鎖的特點和狀態(tài)查詢

    MySQL探秘(五)InnoDB鎖的類型和狀態(tài)查詢
    發(fā)表于 08-07 11:45

    分布式MySQLInnoDB cluster

    分布式MySQL——InnoDB cluster和性能測試
    發(fā)表于 04-15 08:43

    全文檢索技術實現(xiàn)的原理

    全文檢索技術原理
    發(fā)表于 06-03 07:05

    MySQL存儲引擎簡析

    MySQL存儲引擎InnoDB??InnoDB 的存儲文件有兩個,后綴名分別是.frm和.idb,其中.frm是表的定義文件,而.idb是數(shù)據(jù)文件。InnoDB 中存在表鎖和行鎖,不過
    發(fā)表于 09-06 06:07

    基于壓縮倒排文件的中文全文檢索仿真系統(tǒng)

    探討基于壓縮倒排文件的中文全文檢索技術,包括數(shù)據(jù)壓縮方法、存儲、檢索與排名機制。借助中科院的高精度ICTCLAS中文分詞系統(tǒng),采用C++/STL語言仿真實現(xiàn)了一個中文全文
    發(fā)表于 04-23 10:15 ?28次下載

    開放源代碼的全文檢索引擎 Lucene

    開放源代碼的全文檢索引擎 Lucene――介紹、系統(tǒng)結(jié)構與源碼實現(xiàn)分析 第一節(jié) 全文檢索系統(tǒng)與Lucene簡介 一、    
    發(fā)表于 02-10 15:09 ?5次下載

    Windows下MySQL 5.6安裝及配置詳細圖解

    講解Windows下MySQL 5.6安裝及配置詳細圖解,圖文并茂,方便大家安裝
    發(fā)表于 12-09 16:00 ?0次下載

    MySql5.6性能優(yōu)化最佳實踐

    MySql5.6性能優(yōu)化最佳實踐
    發(fā)表于 09-08 08:47 ?13次下載
    <b class='flag-5'>MySql5.6</b>性能優(yōu)化最佳實踐

    最有用的mysql問答

    想進大廠,mysql不會那可不行,來接受mysql面試挑戰(zhàn)吧,看看你能堅持到哪里? 1. 能說下myisam 和 innodb的區(qū)別嗎? myisam引擎是5.1版本之前的默認引擎,支持
    的頭像 發(fā)表于 09-30 17:43 ?1700次閱讀
    最有用的<b class='flag-5'>mysql</b>問答

    MySQL 5.6并行復制架構及并行復制原理

    ySQL 5.6版本也支持所謂的并行復制,但是其并行只是基于schema的,也就是基于庫的。如果用戶的MySQL數(shù)據(jù)庫實例中存在多個schema,對于從機復制的速度的確可以有比較大的幫助。
    發(fā)表于 12-23 14:52 ?527次閱讀

    MySQL中的InnoDB是什么?

    有許多強大的MySQL存儲引擎可供我們使用,而InnoDB無疑是最受歡迎的存儲引擎之一。它高度可靠和高效,因此它成為5.5版本以后所有MySQL的默認存儲引擎也就不足為奇了。
    的頭像 發(fā)表于 04-13 09:09 ?733次閱讀
    主站蜘蛛池模板: 亚洲国产一区二区三区a毛片| 99国产精品农村一级毛片| 日本动漫天堂| 久久黄色视屏| 1024视频在线观看国产成人| 日本最黄| 午夜性| 日本黄色免费在线| 午夜在线网站| 狠狠干狠狠操视频| 中文字幕色综合久久| 天堂综合| 久久精品视频观看| 越南黄色录像| 大又大又粗又爽女人毛片| 亚洲区一二三四区2021| 日本中文在线三级在线播放| 女人特黄大aaaaaa大片| 天天爱天天射| 久久久久国产一级毛片高清版| 色视频在线看| 午夜视频在线免费看| 1024国产看片在线观看| 高hnp汁水bl总受软萌受| 日韩一级在线观看| 午夜免费剧场| 久久精品国产免费中文| 精品xxxxxbbbb欧美中文| 手机看片福利永久| 被男同桌摸内裤好爽视频| 欧美精品videosex性欧美| 一级免费视频| 综合五月激情| 日本成片视频| 欧美7777kkkk免费看258| 亚洲国产成人最新精品资源| 综合视频网| 精品国产免费观看久久久| 欧美色国| 国产又爽又黄又粗又大| 中文字幕11页|