国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

MySQL模糊查詢再也用不著 like+% 了!

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

 前言

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

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

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

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

倒排索引

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

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

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

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

全文檢索

創建全文索引

1、創建表時創建全文索引語法如下: 

  1. CREATE TABLE table_name ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, author VARCHAR(200),   
  2. title VARCHAR(200), content TEXT(500), FULLTEXT full_index_name (col_name) ) ENGINE=InnoDB 

輸入查詢語句: 

  1. SELECT table_id, name, space from INFORMATION_SCHEMA.INNODB_TABLES  
  2. WHERE name LIKE 'test/%'; 

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

2、在已創建的表上創建全文索引語法如下: 

  1. CREATE FULLTEXT INDEX full_index_name ON table_name(col_name); 

使用全文索引

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

其語法如下: 

  1. MATCH(col1,col2,...) AGAINST(expr[search_modifier])  
  2. search_modifier:  
  3.  
  4.     IN NATURAL LANGUAGE MODE  
  5.     | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION  
  6.     | IN BOOLEAN MODE  
  7.     | WITH QUERY EXPANSION  

全文搜索使用 MATCH() AGAINST()語法進行,其中,MATCH()采用逗號分隔的列表,命名要搜索的列。AGAINST()接收一個要搜索的字符串,以及一個要執行的搜索類型的可選修飾符。全文檢索分為三種類型:自然語言搜索、布爾搜索、查詢擴展搜索,下面將對各種查詢模式進行介紹。

Natural Language

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

接下來結合demo來更好的理解Natural Language 

  1. SELECT  
  2.     count(*) AS count   
  3. FROM  
  4.     `fts_articles`   
  5. WHERE  
  6.     MATCH ( title, body ) AGAINST ( 'MySQL' ); 

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

  1. SELECT  
  2.     count(IF(MATCH ( title, body )   
  3.     against ( 'MySQL' ), 1, NULL )) AS count   
  4. FROM  
  5.     `fts_articles`; 

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

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

  1. SELECT  
  2.     *,  
  3.     MATCH ( title, body ) against ( 'MySQL' ) AS Relevance  
  4. FROM  
  5.     fts_articles; 

相關性的計算依據以下四個條件:

  •  word 是否在文檔中出現
  •  word 在文檔中出現的次數
  •  word 在索引列中的數量
  •  多少個文檔包含該 word

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

  •  查詢的 word 在 stopword 列中,忽略該字符串的查詢
  •  查詢的 word 的字符長度是否在區間 [innodb_ft_min_token_size,innodb_ft_max_token_size] 內

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

  1. SELECT  
  2.     *,  
  3.     MATCH ( title, body ) against ( 'for' ) AS Relevance   
  4. FROM  
  5.     fts_articles; 

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

參數 innodb_ft_min_token_size 和 innodb_ft_max_token_size 控制 InnoDB 引擎查詢字符的長度,當長度小于 innodb_ft_min_token_size 或者長度大于 innodb_ft_max_token_size 時,會忽略該詞的搜索。在 InnoDB 引擎中,參數 innodb_ft_min_token_size 的默認值是3,innodb_ft_max_token_size的默認值是84

Boolean

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

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

  1. select * from fts_test where MATCH(content) AGAINST('+Pease -hot' IN BOOLEAN MODE); 

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

  •  +:表示該 word 必須存在
  •  -:表示該 word 必須不存在
  •  (no operator)表示該 word 是可選的,但是如果出現,其相關性會更高
  •  @distance表示查詢的多個單詞之間的距離是否在 distance 之內,distance 的單位是字節,這種全文檢索的查詢也稱為 Proximity Search,如 MATCH(context) AGAINST('"Pease hot"@30' IN BOOLEAN MODE)語句表示字符串 Pease 和 hot 之間的距離需在30字節內
  •  >:表示出現該單詞時增加相關性
  •  <:表示出現該單詞時降低相關性
  •  ~:表示允許出現該單詞,但出現時相關性為負
  • * :表示以該單詞開頭的單詞,如 lik*,表示可以是 lik,like,likes
  •  " :表示短語

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

demo1:+ - 

  1. SELECT  
  2.     *   
  3. FROM  
  4.     `fts_articles`   
  5. WHERE  
  6.     MATCH ( title, body ) AGAINST ( '+MySQL -YourSQL' IN BOOLEAN MODE ); 

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

demo2:no operator 

  1. SELECT  
  2.     *   
  3. FROM  
  4.     `fts_articles`   
  5. WHERE  
  6.     MATCH ( title, body ) AGAINST ( 'MySQL IBM' IN BOOLEAN MODE ); 

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

demo3:@ 

  1. SELECT  
  2.     *   
  3. FROM  
  4.     `fts_articles`   
  5. WHERE  
  6.     MATCH ( title, body ) AGAINST ( '"DB2 IBM"@3' IN BOOLEAN MODE ); 

上述語句,代表 "DB2" ,"IBM"兩個詞之間的距離在3字節之內

demo4:> < 

  1. SELECT  
  2.     *   
  3. FROM  
  4.     `fts_articles`   
  5. WHERE  
  6.     MATCH ( title, body ) AGAINST ( '+MySQL +(>database <DBMS)' IN BOOLEAN MODE ); 

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

demo5: ~ 

  1. SELECT  
  2.     *   
  3. FROM  
  4.     `fts_articles`   
  5. WHERE  
  6.     MATCH ( title, body ) AGAINST ( 'MySQL ~database' IN BOOLEAN MODE ); 

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

demo6:* 

  1. SELECT  
  2.     *   
  3. FROM  
  4.     `fts_articles`  
  5. WHERE  
  6.     MATCH ( title, body ) AGAINST ( 'My*' IN BOOLEAN MODE ); 

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

demo7:" 

  1. SELECT  
  2.     *   
  3. FROM  
  4.     `fts_articles`   
  5. WHERE  
  6.     MATCH ( title, body ) AGAINST ( '"MySQL Security"' IN BOOLEAN MODE ); 

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

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),該查詢分為兩個階段。

  •  第一階段:根據搜索的單詞進行全文索引查詢
  •  第二階段:根據第一階段產生的分詞再進行一次全文檢索的查詢

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

  1. -- 創建索引  
  2. create FULLTEXT INDEX title_body_index on fts_articles(title,body);  
  1. -- 使用 Natural Language 模式查詢  
  2. SELECT  
  3.     *   
  4. FROM  
  5.     `fts_articles`   
  6. WHERE  
  7.     MATCH(title,body) AGAINST('database');

使用 Query Expansion 前查詢結果如下:

 

  1. -- 當使用 Query Expansion 模式查詢  
  2. SELECT  
  3.     *   
  4. FROM  
  5.     `fts_articles`   
  6. WHERE  
  7.     MATCH(title,body) AGAINST('database' WITH QUERY expansion); 

使用 Query Expansion 后查詢結果如下:

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

刪除全文索引

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

  1. DROP INDEX full_idx_name ON db_name.table_name; 

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

  1. ALTER TABLE db_name.table_name DROP INDEX full_idx_name;  

 

責任編輯:龐桂玉 來源: Java知音
相關推薦

2024-04-15 00:08:00

MySQLInnoDB數據庫

2012-11-02 09:45:41

云計算技術云服務

2023-10-26 09:00:58

Arthas工具CPU

2024-02-21 11:06:54

ArthasCPU工具

2021-09-29 11:15:56

PyAutoGUIPython鍵鼠操作

2021-12-26 08:08:00

緩存Cache開發

2010-05-25 09:51:45

IPv6無狀態地址自動

2010-05-21 14:09:41

2010-05-11 19:04:56

Unix系統

2013-08-30 10:08:13

企業移動應用

2021-06-01 20:38:04

Vuex對象import

2013-03-12 14:07:06

Java編程

2020-01-21 21:15:16

WiFi網絡WiFi6

2021-12-14 22:23:07

微信設置電腦

2009-03-30 08:50:50

2021-12-21 09:05:46

命令Linux敲錯

2010-11-22 13:13:30

MySQL模糊查詢

2021-03-15 08:11:40

JVM回收堆內存

2023-07-29 22:02:06

MyBatis數據庫配置

2010-10-29 16:41:12

Oracle模糊查詢
點贊
收藏

51CTO技術棧公眾號

久久精品一区二区三区不卡 | 欧美日韩国产另类一区| 欧美精品一区二区三区在线四季| 成人另类视频| 国产亚洲精品久久久优势| 国产网红在线观看| 日韩欧美在线观看| mm1313亚洲国产精品无码试看| 四季av一区二区凹凸精品| 在线区一区二视频| v888av成人| 岛国av在线一区| 亚洲xxx自由成熟| 色婷婷综合久久久中字幕精品久久| 国产女主播视频一区二区| 五月天久久比比资源色| 奇米一区二区三区四区久久| 国产女大学生av| 77成人影视| 国产精品日韩精品欧美在线| 91在线视频成人| 激情黄产视频在线免费观看| 久久久青草婷婷精品综合日韩| 欧美一二三区在线| 九九热免费精品视频| 亚洲专区免费| 美日韩精品视频免费看| 日本视频在线观看一区二区三区| 久久99久久精品| 欧美国产日本高清在线 | 欧美裸体bbwbbwbbw| 国内精品视频免费| 日本综合视频| 亚洲在线成人精品| 国产免费黄视频| 国产精品嫩草影院在线看| 亚洲精品小视频在线观看| 三上悠亚在线资源| 久久久亚洲综合| 欧美另类交人妖| 九色国产在线观看| 欧美日韩视频免费播放| 日韩在线免费高清视频| 成人综合影院| 久久琪琪电影院| 日韩精品中文字幕第1页| 在线观看一区二区视频| 香蕉视频在线观看免费| 午夜视频一区在线观看| 在线观看高清av| 3344国产永久在线观看视频| 日韩欧美激情四射| 国产成人av毛片| 99在线热播| 激情深爱一区二区| 欧美另类第一页| 成人性生交大片免费看视频在线| 成人福利在线观看| 97精品在线| 国产精品在线看| 亚洲精品a级片| 久久99久久99精品蜜柚传媒| 老司机午夜精品视频在线观看| 国产九色精品| 麻豆高清免费国产一区| www.国产二区| 精品国产精品三级精品av网址| 国产超碰精品在线观看| 色94色欧美sute亚洲13| 在线免费av资源| 成人两性免费视频| 免费在线欧美黄色| 久久视频这里有精品| 电影一区二区在线观看| 欧美少妇bbb| 神马影院午夜我不卡| 欧美黑人xx片| 最近2019好看的中文字幕免费| 欧美男男freegayvideosroom| 91传媒免费看| 91丝袜美腿高跟国产极品老师| 视频国产在线观看| 97在线看免费观看视频在线观看| 欧美一级播放| av天天av| 亚洲国产精品久久久久久| 午夜av一区| 91蝌蚪视频在线观看| 精品国产免费一区二区三区四区| 亚洲国产国产| xfplay精品久久| 日本中文字幕一区二区有码在线| 中文字幕久热精品在线视频| 欧美专区一区二区三区| 在线观看理论片| 日本欧美一二三区| 国产亚洲视频系列| 四虎5151久久欧美毛片| 亚洲国产精品视频一区| 一区二区三区中文| 国产精品老女人视频| 欧美日韩一区二区国产| 久久亚洲精品网站| 国产精品久久久久无码av| 久久精品国产清自在天天线| 啊啊啊久久久| 亚洲精品福利视频| 亚洲一区二区三区四区五区xx| 国产精品一区高清| 国产精品成人v| 97在线视频免费观看完整版| 免费xxxx性欧美18vr| 色偷偷噜噜噜亚洲男人的天堂| 色资源网站在线观看| 亚洲人成亚洲人成在线观看图片 | 国产精品理论在线观看| 福利一区在线| 亚洲美女av网站| 一不卡在线视频| 国产精品成人在线观看| 亚州一区二区三区| 亚洲色图久久久| 国产一区私人高清影院| 日韩欧美成人午夜| 菠萝蜜视频在线观看一区| 视频国产精品| 在线a人片免费观看视频| 欧美一级爱爱| 国产精品高清网站| 亚洲成人av在线| 一区二区三区四区激情 | 亚洲欧美国产精品| 欧美高清在线一区| 日韩精品一二区| 成人免费在线电影网| 男人影院在线观看| 97影院理论午夜| 欧美日韩一区在线播放| 日韩av影视综合网| 欧美日本视频在线| 日本不卡中文字幕| 91精品入口| 看黄在线观看| 国产毛片在线看| 一区二区xxx| 日韩精品免费一区| 日韩精品久久久| 99成人在线| 136福利精品导航| 成年网站在线视频网站| 免费在线看黄网站| 欧美国产综合在线| www激情久久| 超级污的网站| 樱空桃在线播放| 国产精品久久亚洲| 亚洲最大福利视频网| 国产免费久久av| 国产精品成人国产乱一区| 日韩视频欧美视频| 国产亚洲激情视频在线| 欧美mv日韩mv国产网站| 色婷婷综合激情| 欧美日韩免费一区| 亚洲国产日韩精品| 福利一区福利二区微拍刺激| 亚洲国产精品自拍| 图片区日韩欧美亚洲| 日本大香伊一区二区三区| 色综合网站在线| 国产精品伦一区二区| 九色在线91| 两个人看的免费完整在线观看| 色琪琪免费视频网站| 在线激情视频| 日本电影一区二区在线观看| 福利在线导航136| 久久久久久一区二区三区四区别墅| 蜜桃精品在线| 精品网站aaa| 欧美va亚洲va日韩∨a综合色| 亚洲h色精品| 欧美另类视频| 欧美videos中文字幕| 在线观看亚洲成人| 亚洲美女在线观看| 91精品国产99| 国产在线精品一区二区三区》| 亚洲国产美女搞黄色| 欧美理论片在线| 成人短剧在线观看| 怕怕欧美视频免费大全| 婷婷五月色综合香五月| 成人午夜免费av| 亚洲一区在线观看免费观看电影高清 | 是的av在线| 亚洲丁香日韩| 国产精品免费视频一区| 日韩精品一区二区在线观看| 欧美一级电影免费在线观看|