Mysql 如何實現全文檢索,關鍵詞跑分

2022-01-10 21:30:02 字數 4266 閱讀 1157

原文解析

ngram就是一段文字裡面連續的n個字的序列。ngram全文解析器能夠對文字進行分詞,每個單詞是連續的n個字的序列。

例如,用ngram全文解析器對「你好世界」進行分詞:

n=1: '你', '好', '世', '界' 

n=2: '你好', '好世', '世界'

n=3: '你好世', '好世界'

n=4: '你好世界'

mysql 中使用全域性變數 ngram_token_size 來配置 ngram 中 n 的大小,它的取值範圍是1到10,預設值是 2。通常ngram_token_size設定為要查詢的單詞的最小字數。如果需要搜尋單字,就要把ngram_token_size設定為 1。在預設值是 2 的情況下,搜尋單字是得不到任何結果的。因為中文單詞最少是兩個漢字,推薦使用預設值 2。

咱們看一下mysql預設的ngram_token_size大小:

ngram_token_size 變數的兩種設定方式:

1、啟動mysqld命令時指定

mysqld --ngram_token_size=2
2、修改mysql配置檔案

[mysqld] 

ngram_token_size=2

以某文書資料為例,新建資料表 t_wenshu ,並且針對文書內容字段建立全文索引,匯入10w條測試資料。

1、建表時建立全文索引

create table `t_wenshu` (

`province` varchar(255) default null,

`caseclass` varchar(255) default null,

`casenumber` varchar(255) default null,

`caseid` varchar(255) default null,

`types` varchar(255) default null,

`title` varchar(255) default null,

`content` longtext,

`updatetime` varchar(255) default null,

fulltext key `content` (`content`) with parser `ngram`

) engine=innodb default charset=utf8;

2、通過 alter table 方式

alter table t_wenshu add fulltext index content_index (content) with parser ngram;
3、通過 create index 方式

create fulltext index content_index on t_wenshu (content) with parser ngram;
● in boolean mode的特色: 

·不剔除50%以上符合的row。

·不自動以相關性反向排序。

·可以對沒有fulltext index的字段進行搜尋,但會非常慢。

·限制最長與最短的字串。

·套用stopwords。

● 搜尋語法規則:

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

< 降低該條匹配資料的權重值。

~ 將其相關性由正轉負,表示擁有該字會降低相關性(但不像-將之排除),只是排在較後面權重值降低。

* 萬用字,不像其他語法放在前面,這個要接在字串後面。

" " 用雙引號將一段句子包起來表示要完全相符,不可拆字。

1)查詢 content 中包含「盜竊罪」的記錄,查詢語句如下

select caseid,content, match ( content) against ('盜竊罪') as score from t_wenshu where match ( content) against ('盜竊罪' in natural language mode)

2)查詢 content 中包含「尋釁滋事」的記錄,查詢語句如下

select caseid,content, match ( content) against ('尋釁滋事') as score from t_wenshu where match ( content) against ('尋釁滋事' in natural language mode) ;

3)單個漢字,查詢 content 中包含「我」的記錄,查詢語句如下

select caseid,content, match ( content) against ('我') as score from t_wenshu where match ( content) against ('我' in natural language mode) ;

備註:因為設定的全域性變數 ngram_token_size 的值為 2。如果想查詢單個漢字,需要在配置檔案 my.ini 中修改 ngram_token_size = 1 ,並重啟 mysqld 服務,此處不做嘗試了。

4)查詢字段 content 中包含 「危險駕駛」和「尋釁滋事」的語句如下:

select caseid,content, match (content) against ('+危險駕駛 +尋釁滋事') as score from t_wenshu where match (content) against ('+危險駕駛 +尋釁滋事' in boolean mode);
5)查詢字段 content 中包含 「危險駕駛」,但不包含「尋釁滋事」的語句如下:

select caseid,content, match (content) against ('+危險駕駛 -尋釁滋事') as score from t_wenshu where match (content) against ('+危險駕駛 -尋釁滋事' in boolean mode);

6)查詢字段 conent 中包含「危險駕駛」或者「尋釁滋事」的語句如下:

select caseid,content, match (content) against ('危險駕駛 尋釁滋事') as score from t_wenshu where match (content) against ('危險駕駛 尋釁滋事' in boolean mode);

1)使用 mysql 全文索引之前,搞清楚各版本支援情況;

2)全文索引比 like + % 快 n 倍,但是可能存在精度問題;

3)如果需要全文索引的是大量資料,建議先新增資料,再建立索引;

4)對於中文,可以使用 mysql 5.7.6 之後的版本,或者 sphinx、lucene 等第三方的外掛程式;

5)match()函式使用的欄位名,必須要與建立全文索引時指定的欄位名一致,且只能是同乙個表的字段不能跨表;

mysql全文檢索

全文索引在 mysql 中是乙個 fulltext 型別索引。fulltext 索引用於 myisam 表,可以在 create table 時或之後使用 alter table 或 create index 在 char varchar 或 text 列上建立。對於大的資料庫,將資料裝載到乙個沒有...

mysql全文檢索

mysql到版本3.23.23時,開始支援全文檢索,通過語句select from match against 來在整個表中檢索是否有匹配的,全文索引是乙個定義為fulltext的型別索引,應用在myisam表中。值得一提的是對於乙個大的資料庫來說,把資料裝載到乙個沒有fulltext索引的表中,然...

使用mysql實現全文檢索功能

檢視系統預設分片規則 預設innodb下 最小分片為3位 空格切分 show variables like ft 檢視預設分配規則建表 建立表 create table test id int 11 unsigned not null auto increment,product name varc...