抢购插件 如何编写写MySQL全文索引插件

mysql全文搜索与中文全文搜索方法-mysql教程-数据库-壹聚教程网mysql全文搜索与中文全文搜索方法
本文章先是给大家介绍利用mysql自带的全文搜索功能来实现英文与中文全文搜索的对比,然后介绍了由google开发的一款支持中文全文搜索的插件,有需要的朋友可参考
mysql自带的功能。
MySQL的语法
SELECT fields list FROM table WHERE MATCH (
,...) AGAINST (
search_modifier
search_modifier:
{ IN BOOLEAN MODE | WITH QUERY EXPANSION }
* from articles where match(title, body) against(&北京 奥运&)在字段&title,body&上全文搜索&北京 奥运&
注意,MySQL的全文搜索索引只能建立在Myisam引擎上。
&首先用下面表举例:
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
MySQL使用Match()和Against()执行全文搜索,举例如下:
SELECT body FROM articles WHERE Match(body) Against('www.111cn.net');
如上Match是正对指定的列进行搜索,Against('')是正对指定词进行搜索
使用查询扩展WITH QUERY EXPANSION,将会搜索出更多结果(mysql会将匹配的行中有用的词再次进行搜索,这样搜索出来的结果更多,但可能不是你想要的);
使用布尔文本搜索IN BOOLEAN MODE,类似我们平时使用搜索引擎时用到的的语法:逻辑与、逻辑或、逻辑非等.支持的布尔操作符如下:
全文布尔操作符:
--------------------------------------------------------------------------------------------------------------
|操作符&&&&&&&&&&&&&&&&&&&&&&& |&&&&& 说明&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& |
--------------------------------------------------------------------------------------------------------------
|&&& +&&&&&&&&&&&&&&&&&&&&&& |包含,词必须存在&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
|&&&& -&&&&&&&&&&&&&&&&&&&&& |排除,词必须不出现&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
|&&&& &&&&&&&&&&&&&&&&&&&&&& |包含,而且增加等级值&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
|&&&& &&&&&&&&&&&&&&&&&&&&&& |包含,且减少等级值&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
|&&&& ()&&&&&&&&&&&&&&&&&&&&& |把词组成子表达式(允许这些子表达式作为一个组被包含,排除,排列等)
|&&&&& ~&&&&&&&&&&&&&&&&&&&& |取消一个词的排序值
|&&&& *&&&&&&&&&&&&&&&&&&&&&& |词尾的通配符
|&&&& & &&&&&&&&&&&&&&&&&&&&& |定义一个短语(与单个词的列表不一样,它匹配整个短语以便包含或排除这个短语)&
----------------------------------------------------------------------------------------------------------------
使用方法如下:
SELECT * FROM articles WHERE MATCH (title,body)
&&&& AGAINST ('+apple -banana' IN BOOLEAN MODE);
&& + 表示AND,即必须包含。- 表示NOT,即不包含。
SELECT * FROM articles WHERE MATCH (title,body)
&&&& AGAINST ('apple banana' IN BOOLEAN MODE);
&& apple和banana之间是空格,空格表示OR,即至少包含apple、banana中的一个。
SELECT * FROM articles WHERE MATCH (title,body)
&&&& AGAINST ('+apple banana' IN BOOLEAN MODE);
&& 必须包含apple,但是如果同时也包含banana则会获得更高的权重。
SELECT * FROM articles WHERE MATCH (title,body)
&&&& AGAINST ('+apple ~banana' IN BOOLEAN MODE);
&& ~ 是我们熟悉的异或运算符。返回的记录必须包含apple,但是如果同时也包含banana会降低权重。但是它没有 +apple -banana 严格,因为后者如果包含banana压根就不返回。
SELECT * FROM articles WHERE MATCH (title,body)
&&&& AGAINST ('+apple +(&banana &orange)' IN BOOLEAN MODE);
&& 返回同时包含apple和banana或者同时包含apple和orange的记录。但是同时包含apple和banana的记录的权重高于同时包含apple和orange的记录。
MySQL对中文全文索引无法正确支持,下面再介绍一个插件,利用mysqlcft 实现中文全文搜索。
Mysqlcft 是为 MySQL 5.1.22 ~ 5.1.25 RC 开发的中文全文索引插件,用于解决MySQL无法正确支持中文的问题
&精准度很高:采用自创的&三字节交叉切分算法&,对中文语句进行分割,无中文分词词库,搜索精准度远比中文分词算法高,能达到LIKE '%...%&的准确率。
&查询速度快:查询速度比LIKE '%...%&搜索快3~50倍,文章末尾有测试结果;
&标准插件式:以MySQL 5.1全文索引的标准插件形式开发,不修改MySQL源代码,不影响MySQL的其他功能,可快速跟进MySQL新版本;
&支持版本多:支持所有的MySQL 5.1 Release Candidate版本,即MySQL 5.1.22 RC~最新的MySQL 5.1.25 RC;
&支持字符集:支持包括GBK、GB2312、UTF-8、Latin1、BIG5在内的MySQL字符集(其他字符集没有测试过);
&系统兼容好:具有i386和x86_64两个版本,支持32位(i386)和64位(x86_64)CPU及Linux系统;
&适合分布式:非常适合MySQL Slave分布式系统架构,无词库维护成本,不存在词库同步问题。
&mysqlcft中文全文索引只适用于MyISAM表,因为MySQL只支持对MyISAM表建立FULLTEXT索引;
&MySQL不能静态编译安装,否则无法安装mysqlcft插件;
&基于&三字节交叉切分算法&的索引文件会比海量、ft-hightman等基于&中文分词算法&的索引文件稍大,但不是大很多。
根据我的测试,mysqlcft全文索引的.MYI索引文件是.MYD数据文件的2~6倍
插件下载 htt:///p/mysqlcft/
上一页: &&&&&下一页:相关内容适宜做简单搜索的MySQL数据库全文索引
全文索引在 MySQL 中是一个 FULLTEXT 类型索引。FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、VARCHAR 或 TEXT 列上创建。对于大的数据库,将数据装载到一个没有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE (或 CREATE INDEX) 创建索引,这将是非常快的。将数据装载到一个已经有 FULLTEXT 索引的表中,将是非常慢的。
全文搜索通过 MATCH() 函数完成:
mysql& CREATE TABLE articles (
-& id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-& title VARCHAR(200),
-& body TEXT,
-& FULLTEXT (title,body)
Query OK, 0 rows affected (0.00 sec)
mysql& INSERT INTO articles VALUES
-& (NULL,'MySQL Tutorial', 'DBMS stands for DataBase ...'),
-& (NULL,'How To Use MySQL Efficiently', 'After you went through a ...'),
-& (NULL,'Optimising MySQL','In this tutorial we will show ...'),
-& (NULL,'1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
-& (NULL,'MySQL vs. YourSQL', 'In the following database comparison ...'),
-& (NULL,'MySQL Security', 'When configured properly, MySQL ...');
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql& SELECT * FROM articles
-& WHERE MATCH (title,body) AGAINST ('database');
+----+-------------------+------------------------------------------+
| id | title | body |
+----+-------------------+------------------------------------------+
| 5 | MySQL vs. YourSQL | In the following database comparison ... |
| 1 | MySQL Tutorial | DBMS stands for DataBase ... |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)
函数 MATCH() 对照一个文本集(包含在一个 FULLTEXT 索引中的一个或多个列的列集)执行一个自然语言搜索一个字符串。搜索字符串做为 AGAINST() 的参数被给定。搜索以忽略字母大小写的方式执行。对于表中的每个记录行,MATCH() 返回一个相关性值。即,在搜索字符串与记录行在 MATCH() 列表中指定的列的文本之间的相似性尺度。
当 MATCH() 被使用在一个 WHERE 子句中时 (参看上面的例子),返回的记录行被自动地以相关性从高到底的次序排序。相关性值是非负的浮点数字。零相关性意味着不相似。相关性的计算是基于:词在记录行中的数目、在行中唯一词的数目、在集中词的全部数目和包含一个特殊词的文档(记录行)的数目。
它也可以执行一个逻辑模式的搜索。这在下面的章节中被描述。
前面的例子是函数 MATCH() 使用上的一些基本说明。记录行以相似性递减的顺序返回。 下一个示例显示如何检索一个明确的相似性值。如果即没有 WHERE 也没有 ORDER BY 子句,返回行是不排序的。
mysql& SELECT id,MATCH (title,body) AGAINST ('Tutorial') FROM
+----+-----------------------------------------+
| id | MATCH (title,body) AGAINST ('Tutorial') |
+----+-----------------------------------------+
| 1 | 0.84 |
| 3 | 0.89 |
+----+-----------------------------------------+
6 rows in set (0.00 sec)
下面的示例更复杂一点。查询返回相似性并依然以相似度递减的次序返回记录行。为了完成这个结果,你应该指定 MATCH() 两次。这不会引起附加的开销,因为 MySQL 优化器会注意到两次同样的 MATCH() 调用,并只调用一次全文搜索代码。
mysql& SELECT id, body, MATCH (title,body) AGAINST
-& ('Security implications of running MySQL as root') AS score
-& FROM articles WHERE MATCH (title,body) AGAINST
-& ('Security implications of running MySQL as root');
+----+-------------------------------------+-----------------+
| id | body | score |
+----+-------------------------------------+-----------------+
| 4 | 1. Never run mysqld as root. 2. ... | 1.2 |
| 6 | When configured properly, MySQL ... | 1. |
+----+-------------------------------------+-----------------+
2 rows in set (0.00 sec)
MySQL 使用一个非常简单的剖析器来将文本分隔成词。一个&词&是由文字、数据、&'& 和 &_& 组成的任何字符序列。任何在 stopword 列表上出现的,或太短的(3 个字符或更少的)的 &word& 将被忽略。
在集和查询中的每个合适的词根据其在集与查询中的重要性衡量。这样,一个出现在多个文档中的词将有较低的权重(可能甚至有一个零权重),因为在这个特定的集中,它有较低的语义值。否则,如果词是较少的,它将得到一个较高的权重。然后,词的权重将被结合用于计算记录行的相似性。
这样一个技术工作可很好地工作与大的集(实际上,它会小心地与之谐调)。 对于非常小的表,词分类不足以充份地反应它们的语义值,有时这个模式可能产生奇怪的结果。
mysql& SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('MySQL');
Empty set (0.00 sec)
在上面的例子中,搜索词 MySQL 却没有得到任何结果,因为这个词在超过一半的记录行中出现。同样的,它被有效地处理为一个 stopword (即,一个零语义值的词)。这是最理想的行为 -- 一个自然语言的查询不应该从一个 1GB 的表中返回每个次行(second row)。
匹配表中一半记录行的词很少可能找到相关文档。实际上,它可能会发现许多不相关的文档。我们都知道,当我们在互联网上通过搜索引擎试图搜索某些东西时,这会经常发生。因为这个原因,在这个特殊的数据集中,这样的行被设置一个低的语义值。
到 4.0.1 时,MySQL 也可以使用 IN BOOLEAN MODE 修饰语来执行一个逻辑全文搜索。
mysql& SELECT * FROM articles WHERE MATCH (title,body)
-& AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
+----+------------------------------+-------------------------------------+
| id | title | body |
+----+------------------------------+-------------------------------------+
| 1 | MySQL Tutorial | DBMS stands for DataBase ... |
| 2 | How To Use MySQL Efficiently | After you went through a ... |
| 3 | Optimising MySQL | In this tutorial we will show ... |
| 4 | 1001 MySQL Tricks | 1. Never run mysqld as root. 2. ... |
| 6 | MySQL Security | When configured properly, MySQL ... |
+----+------------------------------+-------------------------------------+
最新图文推荐
最新专栏文章
大家感兴趣的内容
网友热评的文章
seajs.config({
base: "/resource/passapi/scripts/"
seajs.use('seajs/seajs-css');
seajs.use(['artdialog/src/dialog-plus'], function (dialog) {
$('#favorite').on('click', function(){
$.getJSON('/passapi.ashx?op=userstatus&callback=?', function(data){
if (data.status == 1) {
var _this = $('#favorite').find('span');
$.getJSON('/?app=favorite&controller=favorite&action=add&jsoncallback=?&contentid='+contentid, function(json){
if(json.state){
_this.html('博客访问: 662887
博文数量: 170
博客积分: 3017
博客等级: 少校
技术积分: 3829
注册时间:
Now in Baidu WISE team
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: PHP
自己在写一个web,希望对数据库做全文检索。但是google了解到,由于中文分词的缘故,mysql只支持英文的全文搜索,想支持中文的,需要各种插件or实现一些比较复杂的机制,而买的虚拟主机并不支持这些复杂的东西。仔细想了下,因为自己需求的功能也比较简单,主要是2个字段的搜索,且数据量不大,即便增加几个字段,需要多运行几个select也不会对速度有太大影响,所以通过一些work around实现了需求。
Step 1:用locate进行简单的搜索
Locate可以判断子串是否在子乱
有两个column,一个name,一个description.
所以可以用LOCATE&0去判断是否关键字在其中出现了。
&SELECT * FROM table WHERE LOCATE(key, 'name')&0 OR LOCATE(key, 'description);
这样,我们就简单实现了对某个key在两个域的搜索
Step 2:搜索多个关键字
通常,搜索都是有多个关键字,所以我们需要对每个关键字,执行下Step1的查询。(当然,也可以合成一个,这里偷懒每次只查询1个关键字)
然后,我们再将每次查询出的数组都合并,这样就得到了一个最终的集合。
php代码如下:
function selectlocate($tarcols,$skey){
&&&&$where ="";
&&&&$connector = " ";
&&&&global $count;
&&&&foreach($tarcols as $tarcol ){
&&&&&&&&$where .= $connector;
&&&&&&&&$where .= "LOCATE('$skey', $tarcol) != 0
&&&&&&&&if($connector == " "){
&&&&&&&&&&&&$connector = " OR ";
&&&&$sql = "SELECT * FROM pets_table WHERE $where";
&&&&$result = mysql_query($sql);
&&&&$ret = Array();
&&&&while($item = mysql_fetch_array($result, MYSQL_ASSOC)){
&&&&&&&&$count ++;
&&&&&&&&$ret[] = $item;
&&&&return $ret;
Step 3:匹配的权重
上面Step2的结果,其实是无序的。通常,如果我们搜索一个字段:
1.如果这个字段和关键字完全相同,那么一般来讲,可能这个结果应该是相关度最高的
2.如果他只是其其中出现了一次,相关度就最低。
3.如果他出现的次数比在其他row中出现的次数高,那么他的相关度就比2中的结果高
所以,搜索的时候依据这个顺序考虑权重,
a.如果完全相等,权重为1000
b.如果出现1次,权重为10,出现n次
c.权重为n*10
每次搜索出来的结果附加上权重----》然后合并相同项----》并把权重累加
最后按权重排序,即可得到一个有排序的搜索结果。
以下是两种1关键字对应1个字段(上面的代码是1关键字多个字段)查询的代码(不包含合并两个数组的代码,相关的代码在Step4中),只需遍历每个关键字和字段,就能完成搜索
$count = 0;
function selectequal($col,$skey){
&&&&$connector = " ";
&&&&global $count;
&&&&$sql = "SELECT * FROM pets_table WHERE LOWER($col)=LOWER('$skey')";
&&&&$result = mysql_query($sql);
&&&&$ret = Array();
&&&&while($item = mysql_fetch_array($result, MYSQL_ASSOC)){
&&&&&&&&$count ++;
&&&&&&&&$item["weight"] = 1000;
&&&&&&&&$ret[] = $item;
&&&&return $ret;
function selectlocate($col,$skey){
&&&&global $count;
&&&&$sql = "SELECT *,(LENGTH(description) - LENGTH(REPLACE(description, '$skey', '')))/LENGTH('$skey') *10 as weight FROM pets_table WHERE LOCATE(LOWER('$skey'),LOWER($col))&0";
&&&&$result = mysql_query($sql);
&&&&$ret = Array();
&&&&while($item = mysql_fetch_array($result, MYSQL_ASSOC)){
&&&&&&&&$count ++;
&&&&&&&&$ret[] = $item;
&&&&return $ret;
Step 4: 字段的权重
在我的需求中,显然name这个字段比description更重要,所以在匹配时,对name字段的结果应该有所倾斜,所以,又可以增加一个对字段的权重系数。
1.如果是在name域的匹配,设系数为10;
2.如果是在description匹配,设系数为1;
将Step 3每次计算得出的权重,再乘上这个系数,就可以得到一个新的,更有效的权重值。
最后按权重排序,即可得到一个最有相关度排序的搜索结果
其他的细节:
如果一个关键字已经满足了equal条件,那么再使用locate条件的时候会依然返回一个结果,所以在使用locate条件的时候,过滤掉equal的情况
$count = 0;
function selectequal($col,$val,$skey){
&&&&$connector = " ";
&&&&global $count;
&&&&$sql = "SELECT * FROM pets_table WHERE LOWER($col)=LOWER('$skey')";
&&&&$result = mysql_query($sql);
&&&&$ret = Array();
&&&&while($item = mysql_fetch_array($result, MYSQL_ASSOC)){
&&&&&&&&$count ++;
&&&&&&&&$item["weight"] = 1000*$val;
&&&&&&&&$ret[] = $item;
&&&&return $ret;
function selectlocate($col,$val,$skey){
&&&&global $count;
&&&&$sql = "SELECT *,(LENGTH(description) - LENGTH(REPLACE(description, '$skey', '')))/LENGTH('$skey') *10*$val as weight FROM pets_table WHERE LOCATE(LOWER('$skey'),LOWER($col))&0 AND LOWER($col)!=LOWER('$skey')";
&&&&$result = mysql_query($sql);
&&&&$ret = Array();
&&&&while($item = mysql_fetch_array($result, MYSQL_ASSOC)){
&&&&&&&&$count ++;
&&&&&&&&$ret[] = $item;
&&&&return $ret;
function cleanarr($arr){
&&&&global $count;
&&&&$tmp = Array();
&&&&$tmpall = Array();
&&&&foreach($arr as $item){
&&&&&&&&if(array_key_exists($item['uid'], $tmp)){
&&&&&&&&&&&&$tmp[$item['uid']]+=$item["weight"];
&&&&&&&&else{
&&&&&&&&&&&&$tmp[$item['uid']] = $item["weight"];
&&&&&&&&&&&&$tmpall[$item['uid']] = $item;
&&&&//sort by weight in descending order
&&&&arsort($tmp);
&&&&$ret = Array();
&&&&//rebuild&the return arary&
&&&&$count = 0;
&&&&foreach($tmp as $k=&$v){
&&&&&&&&$count++;
&&&&&&&&$tmpall[$k]['weight']=$v;
&&&&&&&&$ret[]=$tmpall[$k];
&&&&return $ret;
require_once("consvr.php");
&&&&$colshash = array("name"=&10,"description"=&1);
&&&&$ret = Array();
&&&&$keywords=explode(" ", $keywords);
&&&&$cols = array_keys($colshash);
&&&&foreach($keywords as $keyword){
&&&&&&&&foreach($colshash as $col=&$val){
&&&&&&&&&&&&$ret = array_merge($ret,selectequal($col,$val, $keyword));
&&&&&&&&&&&&$ret = array_merge($ret,selectlocate($col,$val, $keyword));
&&&&$ret = cleanarr($ret);
&&&&$ret = array('msg' =& "Success", 'count'=&$count,'children' =& $ret, 'query'=&"COMPLEX:NOT READABLE");
&&&&echo json_encode($ret);
&&&&mysql_close();
阅读(6997) | 评论(1) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。分享mysql中文全文搜索:中文分词简单函数
- ThinkPHP框架
分享mysql中文全文搜索:中文分词简单函数 原文地址:
前段时间研究中文全文搜索,结果发现mysql不支持中文的全文搜索。但是有一些解决办法,就是手动把中文单词用空格分开,然后搜索的时候加 上 in boolean mode。 但是这就带来一个问题,就是中文分词。这个是个很大的难题,貌似中科院有个小组就是专门做中文分词技术的。我们用 php来分词的话,要实现真正语义上的分词是非常困难的,就算实现了效率也不高。一般情况下,我们采用的是如下方法分词:
比如我们有一句话:你好我是刘春龙
那么我们可以这样来分词: 你好 好我 我是 是刘 刘春 春龙
这样虽然看起来有点傻,但是实际应用起来确实可行,因为我们搜索时候输入的关键词也是按照这个方法分词。
下面有个我自己写的函数,可以实现这种分词。传入三个参数,分别是:
1.需要分词的字符串,必须,英文,标点,数字,汉字,日语等都可以。编码为UTF-8
2.是否返回字符串,可选,默认是。如果传入false,那么将返回一个数组。
3.是否base64_encode中文,可选,默认是。Mysql的全文搜索有个配置是 ft_min_word_len 这个值一般是4,而 我们分成的中文词语是两个字,就不会被mysql认为是一个词。而base64_encode过后,词语的长度为8,就不存在最小长度问题 了。 base64_encode过后数据量会增大 50%。
注意,这里输入和输出的字符串编码都是UTF-8 function&string2words($s,$return_string&=&true,$encode64&=&true)&
&&&&&&&&$re&=&'';&
&&&&&&&&//匹配汉字&
&&&&&&&&if&(preg_match_all(&/([x{4e00}-x{9fff}]{2,})/u&,$s,$ms))&
&&&&&&&&{&
&&&&&&&&&&&&&&&&foreach($ms[0]&as&$w)&
&&&&&&&&&&&&&&&&{&
&&&&&&&&&&&&&&&&&&&&&&&&//关键部分:分词&
&&&&&&&&&&&&&&&&&&&&&&&&$l&=&strlen($w)/3;&
&&&&&&&&&&&&&&&&&&&&&&&&for($i=0;$i&$l;$i++)&
&&&&&&&&&&&&&&&&&&&&&&&&{&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$wi&=&substr($w,$i*3,6);&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(strlen($wi)&&&3)&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$re&.=&($encode64)?'&'.str_replace(',','@',base64_encode($wi)):'&'.$&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&
&&&&&&&&&&&&&&&&&&&&&&&&}&
&&&&&&&&&&&&&&&&}&
&&&&&&&&}&
&&&&&&&&//匹配数字&
&&&&&&&&if&(preg_match_all(&/(d+[.]?d+)/&,$s,$ms))&
&&&&&&&&{&
&&&&&&&&&&&&&&&&foreach($ms[0]&as&$wi)&
&&&&&&&&&&&&&&&&{&
&&&&&&&&&&&&&&&&&&&&&&&&if(strlen($wi)&&=&2)&
&&&&&&&&&&&&&&&&&&&&&&&&{&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$re&.=&($encode64)?'&'.str_replace(',','@',base64_encode($wi)):'&'.$&
&&&&&&&&&&&&&&&&&&&&&&&&}&
&&&&&&&&&&&&&&&&}&
&&&&&&&&&&&&&&&&$s&=&preg_replace(&/(d+[.]?d+)/&,'&',$s);&
&&&&&&&&}&
&&&&&&&&//去掉所有双字节字符&
&&&&&&&&$s&=&preg_replace(&/([^x{00}-x{ff}]+)/u&,'&',$s);&
&&&&&&&&$re&=&$s.'&'.$&
&&&&&&&&if&(!$return_string)&
&&&&&&&&{&
&&&&&&&&&&&&&&&&$re&=&preg_replace(&/([^d])([,.-?n])([^d])/&,'$1&$3',$re);&
&&&&&&&&&&&&&&&&$re&=&trim(preg_replace(&/[s]{2,}/&,'&',$re));&
&&&&&&&&&&&&&&&&$arr&=&explode('&',$re);&
&&&&&&&&&&&&&&&&$re&=&array();&
&&&&&&&&&&&&&&&&foreach($arr&as&$a)&
&&&&&&&&&&&&&&&&{&
&&&&&&&&&&&&&&&&&&&&&&&&if&(strlen($a)&&=&2)&$re[]&=&$a;&
&&&&&&&&&&&&&&&&}&
&&&&&&&&&&&&&&&&return&$&
&&&&&&&&}&
&&&&&&&&else&
&&&&&&&&{&
&&&&&&&&&&&&&&&&$re&=&trim(preg_replace(&/[s,.]{2,}/&,'&',$re));&
&&&&&&&&&&&&&&&&return&$&
&&&&&&&&}&
}&原文地址:
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。PHP+Sphinx+MySQL实现全文检索—理论篇 php教程
(评价人数不足)
知识量:--
授课水平:--
实用性:--
课程设计:--
难度:简单
开始时间:时间自主
持续时间:暂无
课程介绍课程通过mysql搜索引入sphinx检索,让大家对sphinx有新的认知,并介绍了当前互联网站内应用sphinx检索优势,课程循序渐进,通俗易懂,对重点难点技术做了详细讲解,通过学习本课程我们能熟练的使用sphinx工具。课程提纲第1章 Sphinx优势及概述介绍什么sphinx现状,为何引入sphinx,以及sphinx是能够解决什么问题,在什么场合使用,有何种优势。第2章 Sphinx应用场景介绍Sphinx应用场景,并结合分析sphinx检索数据快在何处。第3章 Sphinx进阶介绍如何获取服务器所需的sphinx以及sphinx的工作原理,带领大家学习如何查看Sphinx数据。第4章 理论篇课程总结对Sphinx的相关知识点以及重难点进行总结。 讲师提示singwaPHP开发工程师课程须知学习本门课程之前,建议先了解一下知识,会更有助于理解和掌握本门课程 1、掌握mysql基础知识 2、熟悉linux命令 3、有一定的LAMP下的项目经验老师告诉你能学到什么?1、sphinx如何工作? 2、为什么要用sphinx 3、如何生成索引数据 4、inderex、searchd工具使用
课程笔记没有人写笔记耶……放着我来!
沙发居然还空着?!速抢!

我要回帖

更多关于 如何编写cad插件 的文章

 

随机推荐