mysql中的全文檢索是利用查詢關鍵字和查詢列內容之間的相關度進行檢索,可以利用全文索引來提高匹配的速度。
match (col1,col2,...) against (expr [search_modifier])
search_modifier:
# 例如
select * from tab_name where
match (col1,col2) against (search_word);
舊版的mysql的全文索引只能用在myisam**的char、varchar和text的字段上。
不過新版的mysql5.6.24上innodb引擎也加入了全文索引。
上面的search_modifier是全文索引的檢索方式,mysql中有三種型別的全文檢索:
1、自然語言檢索
全文檢索中的預設型別。把查詢字串作為乙個短語,如果有不少於50%的行匹配,則認為沒有匹配的。想去掉50%的限制,可以修改檔案myisam/ftdefs.h裡的#define gws_in_use gws_prob為#define gws_in_use gws_freq。
查詢的字串大小寫不敏感,可以通過指定列的校驗碼為二進位制的來實現大小寫敏感。如字符集是latin1,可以指定校驗碼為latin1_bin。相關性排序的依據:行中的詞總數、行中不同的詞個數、集合中全部的詞總數、查詢到的行數。
只能進行單錶查詢,布林檢索可以進行多表查詢。
2、布林檢索
沒有50%的限制。可以用包含特定意義的操作符,如 +、-、」「,作用於查詢字串上。查詢結果不是以相關性排序的。
3、查詢括展檢索
對自然語言檢索的一種改動(自動相關性反饋),當查詢短語太短時有用。先進行自然語言檢索,然後把最相關的一些(系統變數ft_query_expansion_limit的值)行中的詞新增到查詢字串中進行二次自然語言檢索,查詢得到的行作為結果返回。
對大多數的多位元組字符集適用,進行全文索引的列必須使用相同的字符集和校驗碼(collation);
表意性語言,如漢語、日語沒有詞分界符(英語用空格隔開每個單詞),全文分析器無法確定乙個詞的開始和結尾,所以mysql中的全文檢索不支援;
在自然語言檢索中,只能檢索被全文索引的那些列,如果要對索引的多列進行某一列的檢索,必須對這一列單獨建立全文索引。布林檢索可以在非索引的列上進行,但會慢一些;
against後的引數必須是常量字串;
如果索引不在記憶體中,檢索速度會很慢;如果是短語查詢,需要索引和資料都在記憶體中,否則速度會很慢,所以需要更大的key buffer。索引有碎片時也會很慢,所以需要更頻繁的optimize table操作;
全文索引對於insert、update、delete都很慢。如更改100個詞需要進行100次的索引操作而不是1次。
構建全文索引時把要索引的列連起來(所以不能對其中的某一列進行全文檢索)作為乙個長的字串進行索引。構建好的全文索引是一種擁有兩層結構的特殊b樹索引。
第一層是各個關鍵字(keywords),第二層是關鍵字所在的文件指標
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索引的表中,然...
Lucene全文檢索系列(一)
lucene是乙個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎。lucene以其方便使用 快速實施以及靈活性受到廣泛的關注。它可以方便地嵌入到各種應用中實現針對應用的全文索引 檢索功能。1 analysis對需要建立索引的文字進行分詞 過濾等操作 2 standard是標準分析器 3 docu...