mysql自帶訂閱功能 MySQL內建全文檢索

2021-10-18 11:56:47 字數 4030 閱讀 8142

概述

版本說明

mysql5.5中,只有myisam支援全文檢索。

mysql5.6中,innodb開始支援全文檢索。

mysql5.7中,可以使用n-gram外掛程式支援全文檢索。此外掛程式支援中/日/韓文。

全文檢索的使用限制

只能在型別為char、varchar或者text的字段上建立全文索引。

只支援innodb和myisam引擎。

乙個表只能建立

乙個全文檢索字段。如需要檢索多個字段,需要將多個字段一起建立

乙個索引。

n-gram解析器

mysql中使用全域性變數"ngram_token_size"來配置n-gram中n的大小;取值範圍:1~10,預設值:2。

通常將ngram_token_size的值設定為要查詢的單詞的最小字數。如果需要搜尋單字,就要把ngram_token_size設定為1。在預設值是2的情況下,搜尋單字是得不到任何結果的。

中文單詞最少是兩個漢字,推薦使用預設值2。

引數設定

修改mysql的配置檔案:my.ini或my.cnf

[client]

ft_min_word_len=2

[mysqld]

ft_min_word_len=2

ngram_token_size=2

修改後記得重啟mysql服務

全文檢索操作

建立索引

# 建表時建立

create table t_member (

`id` int unsigned auto_increment not null primary key,

`cn_name` varchar(100),

`remark` text,

fulltext `ft_idx_1`(`cn_name`, `remark`) with parser ngram

) engine = innodb;

# 修改表時新增

alter table t_member

add fulltext index `ft_idx_1`(`cn_name`,`remark`)

with parser ngram;

# 直接建立

create fulltext index `ft_idx_1`

on t_member (`cn_name`,`remark`)

with parser ngram;

刪除索引

drop index `ft_idx_1` on t_member;

重建索引

只適用於myisam引擎,在修改表的全文檢索設定後執行。

repair table t_member quick;

全文檢索的使用

基礎語法

select  from 

where

注意:match中的字段要與全文檢索定義時的字段個數相同。

# 全文檢索定義了`cn_name`,`remark`字段,所以在match中要把這兩個欄位都寫上

select `cn_name`, `remark`

from t_member

where

match(`cn_name`, `remark`)

against('張三');

查詢匹配度

可用於查詢資料的匹配度

select `cn_name`, `remark`,

match(`cn_name`, `remark`) against('張三')

from t_member;

全文檢索模式

1. 自然語言模式(natural language mode)

mysql預設的全文檢索模式。此模式不能使用操作符,用於簡單查詢。

2. boolean模式(boolean mode)

50%的限制

在使用全文檢索時,常提到「50%的限制」。搜到一段解釋如下:

剔除一半匹配行以上都有的詞,譬如說,每個行都有this這個字的話,那用this去查時,會找不到任何結果,這在記錄條數特別多時很有用,原因是資料庫認為把所有行都找出來是沒有意義的,這時,this幾乎被當作是stopword(中斷詞);但是若只有兩行記錄時,是啥鬼也查不出來的,因為每個字都出現50%(或以上),要避免這種狀況,請用in boolean mode。

boolean模式中的語法

>:提高該條匹配資料的權重值。

"":用雙引號表示要查詢內容要完全相符,不可拆字。

舉例# 無操作符,表示或

select `cn_name`, `remark`

from t_member

where

match(`cn_name`, `remark`)

against ('一般 搜尋' in boolean mode);

# 必須同時包含「一般」和「搜尋」

select `cn_name`, `remark`

from t_member

where

match(`cn_name`, `remark`)

against ('+一般 +搜尋' in boolean mode);

# 必須包含「搜尋」,但是如果包含「一般」,相關性會更高。

select `cn_name`, `remark`

from t_member

where

match(`cn_name`, `remark`)

against ('+搜尋 一般' in boolean mode);

# 必須包含「一般」,同時不能包含「搜尋」。

select `cn_name`, `remark`

from t_member

where

match(`cn_name`, `remark`)

against ('+一般 -搜尋' in boolean mode);

# 必須包含「搜尋」,但是如果也包含「一般」的話,相關性要比不包含「一般」的記錄低。

select `cn_name`, `remark`

from t_member

where match(`cn_name`, `remark`)

against ('+搜尋 ~一般' in boolean mode);

# 查詢必須包含「一般」「簡單」或者「一般」「搜尋」的記錄,但是「一般」「簡單」的相關性要比「一般」「搜尋」高。

select `cn_name`, `remark`

from t_member

where

match(`cn_name`, `remark`)

against ('+一般 +(>簡單 

# *:星號,查詢包含以搜尋開頭的單詞的記錄。

select `cn_name`, `remark`

from t_member

where

match(`cn_name`, `remark`)

against ('搜尋*' in boolean mode);

# 雙引號,把要搜素的詞括起來,效果類似於like '%some words%',

# 例如「some words of wisdom」會被匹配到,而「some noise words」就不會被匹配。

# 但是對中文來說,感覺效果一般。

## 沒有雙引號,有結果

select `cn_name`, `remark`

from t_member

where

match(`cn_name`, `remark`)

against ('一般 簡單 搜尋' in boolean mode);

## 有雙引號,沒結果,一般中文不會這麼查詢吧

select `cn_name`, `remark`

from t_member

where

match(`cn_name`, `remark`)

against ('"一般 簡單 搜尋"' in boolean mode);

小結對於小專案來說,mysql的全文檢索應該夠用了,甚至like都夠用了。

對全文檢索有更高的需求,或者要跟上技術的更新換代,還是用es吧 。

redis 訂閱功能

redis 通過 publish subscribe 等命令實現了訂閱與發布模式。舉例1 qq群的公告,單個發布者,多個收聽者 命令publish channel msg 將資訊 message 傳送到指定的頻道 channel subscribe channel channel 訂閱頻道,可以同時...

mysql自帶 Mysql自帶函式

1.ifnull 函式 格式 ifnull expr1,expr2 說明 如果expr1不是null,ifnull 返回expr1,否則它返回expr2。ifnull 返回乙個數字或字串值,取決於它被使用的上下文環境。舉例 mysql select ifnull 1,0 ifnull 1,0 1 1...

Redis 發布訂閱功能

在redis中發布訂閱功能是由publish subscribe unsubscribe psubscribe組成的。publish是發布,subscribe是訂閱,unsubscribe是取消訂閱,psubscribe是訂閱模式,所謂模式也就是可以對應多個頻道的 頻道 例如訂閱了 abc hell...