中文全文检索

中文全文检索 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

相关文章
相关标签/搜索