中文全文檢索

中文全文檢索 MySQL不支持中文全文檢索,由於中文一句話是連着寫的,不像英文單詞間有空格分隔。解決辦法就是中文分詞(關於中文分詞請參閱其它文章),若是你的MySQL是安裝在Windows平臺上的,能夠不用轉碼直接存儲中文就可使用全文索引,如本例。可是若是你的MySQL是安裝在Linux上的則須要進行轉編碼(urlencode / base64_encode / json_encode / 區位 / 拼音)等方案,具體方案參看其它博文。php

MYSQL全文搜索經過 MATCH() 函數完成。html

  下面舉一簡單例子:mysql

  一、新建數據表:sql

  CREATE TABLE fulltext_sample(copy TEXT,FULLTEXT(copy)) TYPE=MyISAM;thinkphp

  這裏的copy就是一個fulltext類型的字段,若是建表的時候沒有添加全文檢索字段,也能夠經過alert來添加,如:json

  ALTER TABLE fulltext_sample ADD FULLTEXT(copy)api

  二、插入數據:服務器

  INSERT INTO fulltext_sample VALUESapp

  ('It appears good from here'),函數

  ('The here and the past'),

  ('Why are we hear'),

  ('An all-out alert'),

  ('All you need is love'),

  ('A good alert');

  三、數據檢索:

  SELECT * FROM fulltext_sample WHERE MATCH(copy) AGAINST('love');

  上面就是mysql的全文檢索功能,注意:在全文索引上進行搜索是不區分大小寫的。

  下面再看如何實現中文全文檢索。

  fulltext字段是以詞語爲單位,詞語之間須要用空格隔開,而漢語的句子中各個詞語之間並不會用空格隔開,所以咱們須要對中文進行分詞,這也就是爲何上面須要強詞用到中文分詞擴展模塊。

  可是儘管對中文進行分詞,MYSQL仍是不能經過MATCH來實現中文的全文檢索,這須要經過必定的方法來進行轉換,一個比較簡單實用的方法是採用下面這個函數(固然還有更好的),它將中文進行了urlencode轉換。

  function q_encode($str)

  {

  $data = array_filter(explode(" ",$str));

  $data = array_flip(array_flip($data));

  foreach ($data as $ss) {

  if (strlen($ss)>1 )

  $data_code .= str_replace("%","",urlencode($ss)) . " ";

  }

  $data_code = trim($data_code);

  return $data_code;

  }

  將轉換事後的內容保存至事先定義好的fulltext字段。一樣,在查詢的時候也須要將查詢的關鍵詞進行一樣方法的轉換。

*、語法 MATCH (col1,col2,...) AGAINST (expr [search_modifier]) search_modifier: { IN BOOLEAN MODE | WITH QUERY EXPANSION }

例如:SELECT * FROM tab_name WHERE MATCH ('列名1,列名2...列名n') AGAINST('詞1 詞2 詞3 ... 詞m');

  即:MATCH 至關於要匹配的列,而 AGAINST 就是要找的內容。  
  這裏的table須要是MyISAM類型的表,col一、col2 必須是char、varchar或text類型,在查詢以前須要在 col1 和 col2 上分別創建全文索引(FULLTEXT索引)。

*、總結事項 一、預設搜尋是不分大小寫,若要分大小寫,columne 的 character set要從utf8改爲utf8_bin。 二、預設 MATCH...AGAINST 是以相關性排序,由高到低。 三、MATCH(title, content)裏的字段必須和FULLTEXT(title, content)裏的字段如出一轍。 若是隻要單查title或content一個字段,那得另外再建一個 FULLTEXT(title) 或 FULLTEXT(content),也由於如此,MATCH()的字段必定不能跨table,可是另外兩種搜尋方式好像能夠。

http://simonfenci.sinaapp.com/index.php?key=simon&wd=寶奧城玩具城電動玩具 返回: Array ( [0] => Array ( [word] => 寶 [word_tag] => 95 [index] => 0 ) [1] => Array ( [word] => 奧 [word_tag] => 193 [index] => 1 ) [2] => Array ( [word] => 城 [word_tag] => 95 [index] => 2 ) [3] => Array ( [word] => 玩具城 [word_tag] => 95 [index] => 3 ) [4] => Array ( [word] => 電動 [word_tag] => 20 [index] => 4 ) [5] => Array ( [word] => 玩具 [word_tag] => 95 [index] => 5 ) )

*新浪的分司用法 (http://apidoc.sinaapp.com/source-class-SaeSegment.html#12-650) endpoint = "http://segment.sae.sina.com.cn/urlclient.php?encoding=UTF-8" data = { "context": "柯林斯英漢雙解大詞典", "word_tag": 1 } r = requests.post(endpoint, data=data) r.encoding='utf-8' return r.text


Discuz! 在線中文分詞、關鍵詞提取服務 不一樣於使用本身的服務器進行分詞,Discuz!在線中文分詞服務是基於API返回分詞結果的。在項目中,咱們只須要一個函數便可方便地進行分詞、關鍵詞提取。 如下是根據Discuz!在線分詞服務API寫的函數,測試可正常運行:全文:http://www.thinkphp.cn/code/563.html

相關文章
相關標籤/搜索