原文鏈接 http://blog.csdn.net/manbujingxin/article/details/6656992
前提:mysql只支持英文內容的全文索引,所以只考慮英文的全文搜索。
假定數據表名為post,有三列:id、title、content。id是自增長序號,
title是varchar,content是text,給content添加全文索引。
mysql全文搜索有三種模式:
一、自然語言查找。這是mysql默認的全文搜索方式,sql示例:
1 |
select id,title FROM post WHERE MATCH(content) AGAINST ( 'search keyword' ) |
或者顯式聲明使用自然語言搜索方式
1 |
select id,title FROM post WHERE MATCH(content) AGAINST ( 'search keyword' IN NATURAL LANGUAGE MODE) |
由於自然語言搜索方式是默認模式,所以可以省略聲明模式的“IN NATURAL LANGUAGE MODE”部分。
自然語言搜索模式的么特點:
- 忽略停詞(stopword),英語中頻繁出現的and/or/to等詞被認為是沒有實際搜索的意義,搜索這些不會獲得任何結果。
- 如果某個詞在數據集中頻繁出現的幾率超過了50%,也會被認為是停詞,所以如果數據庫中只有一行數據,不管你怎么全文搜索都不能獲得結果。
- 搜索結果都具有一個相關度的數據,返回結果自動按相關度由高到低排列。
- 只針對獨立的單詞進行檢索,而不考慮單詞的局部匹配,如搜索box時,就不會將boxing作為檢索目標。
二、布爾查找。這種查找方式的特點是沒有自然查找模式中的50%規則,即便有詞語在數據集中頻繁出現的幾率超過50%,
也會被作為搜索目標進行檢索並返回結果,而且檢索時單詞的局部匹配也會被作為目標進行檢索。sql示例
1 |
select id,title FROM post WHERE MATCH(content) AGAINST ( 'search keyword' IN BOOLEAN MODE) |
三、帶子查詢擴展的自然語言查找。
1 |
select id,title FROM post WHERE MATCH(content) AGAINST ( 'search keyword' IN BOOLEAN MODE WITH EXPANSION) |
暫時沒有明白這種模式。
在我的實際使用中還發現了以下細節:
- 布爾查找時必須指定返回結果的排序方式,它不會像自然語言查找那樣會自動將結果按相關度排序返回。
- 即使是布爾查找,對長度小於等於3的單詞也不會進行檢索,因為mysql有一個系統變量FT_MIN_WORD_LE
指定了全文檢索時可接受的最小單詞長度,默認值是4。.