当前位置: 移动技术网 > IT编程>数据库>Mysql > mysql全文搜索 sql命令的写法

mysql全文搜索 sql命令的写法

2017年12月12日  | 移动技术网IT编程  | 我要评论

造梦西游2七彩袍,小西的美母教师23,追龙迅雷

mysql全文搜索,sql的写法:
match (col1,col2,…) against (expr [in boolean mode | with query expansion])
比如:
select * from articles where match (title,body) against ('database');
match()函数对于一个字符串执行资料库内的自然语言搜索。一个资料库就是1套1个或2个包含在fulltext内的列。搜索字符串作为对 against()的参数而被给定。对于表中的每一行, match() 返回一个相关值,即, 搜索字符串和 match()表中指定列中该行文字之间的一个相似性度量。
下面的例子则更加复杂。询问返回相关值,同时对行按照相关性渐弱的顺序进行排序。为实现这个结果,你应该两次指定 match(): 一次在 select 列表中而另一次在 where子句中。这不会引起额外的内务操作,原因是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');

所以,到这里你应该会mysql 英文全文搜索了.
请注意一个问题.
一些词在全文搜索中会被忽略:
* 任何过于短的词都会被忽略。 全文搜索所能找到的词的默认最小长度为 4个字符。
* 停止字中的词会被忽略。
mysql还自带查询扩展功能.这里不做过多讨论.
下面进行php中文全文搜索的分析
曾经有一个版本的mysql支持中文全文搜索(海量 mysql chinese+,说是gpl但是最终没有开源)
中文全文搜索的关键是在分词上.mysql本身不支持cjk的分词(cjk:chinese,japanese,korean),
所以
!!!!****如何用php模拟分词是mysql全文索引的关键****!!!!
中文分词是语言分词中最困难的.现在也没有人能够彻底完美的解决(虽然这些搜索引擎做的都还不错.)
复制代码 代码如下:

//fcicq:下面给大家看看这里php的分词是怎么做的.
function &dv_chinesewordsegment($str,$encodingname='gbk'){
static $objenc = null;
if( $objenc === null ){
if( !class_exists('dv_encoding') ){
require_once root_path.'inc/dv_encoding.class.php';
}
$objenc =& dv_encoding::getencoding($encodingname);
}
$strlen = $objenc->strlength($str);
$returnval = array();
if( $strlen < = 1 ){
return $str;
}
$arrstopwords =& dv_getstopwordlist();
//print_r($arrstopwords);
//过滤所有html标签
$str = preg_replace('#<[a-za-z]+?.*?>|#is', ”, $str);
//过滤所有stopword
$str = str_replace($arrstopwords['strrepl'],' ‘,$str);
$str = preg_replace($arrstopwords['pregrepl'],' ‘,$str);
//echo “$str:{$str}
“;
$arr = explode(' ‘,$str);
//fcicq:好了,这下面的才是php分词关键 *************
foreach( $arr as $tmpstr ){
if ( preg_match(”/^[x00-x7f]+$/i”,$tmpstr) === 1 )
{ //fcicq:全是e文,没关系,mysql可以认识的
$returnval[] = ‘ ‘.$tmpstr;
} else{ //fcicq:中英混合…
preg_match_all(”/([a-za-z]+)/i”, $tmpstr, $matches);
if( !empty($matches) ){ //fcicq:英语部分
foreach( $matches[0] as $matche ){
$returnval[] = $matche;
}
}
//过滤ascii字符
$tmpstr = preg_replace(”/([x00-x7f]+)/i”, ”
, $tmpstr); //fcicq:你看,剩下的不就全是中文了?
$strlen = $objenc->strlength($tmpstr)-1;
for( $i = 0 ; $i < $strlen ; $i++ ){
$returnval[] = $objenc->substring($tmpstr,$i,2)
; //fcicq:注意这里的substr,不是手册上的.
//fcicq:你仔细看,所有的词都是分成两个.
//比如”数据库的应用”,会被分成数据 据库 库的 的应 应用…
//全文搜索: 全文 文搜 搜索
//这分词自然是不怎么样的
//但是,搜索的时候同样这么做.
//比如搜索数据库,就相当于搜索了数据 据库.
//这是一种相当传统的全文搜索分词方法.
}
}
}
return $returnval;
}//end function dv_chinesewordsegment
//fcicq:这就是传说中的substr.偶相信许多人写出来的php代码都比这个好.
function &substring(&$str,$start,$length=null){
if( !is_numeric($start) ){
return false;
}
$strlen = strlen($str);
if( $strlen < = 0 ){
return false;
}
if( $start < 0 || $length < 0 ){
$mbstrlen = $this->strlength($str);
} else{
$mbstrlen = $strlen;
}
if( !is_numeric($length) ){
$length = $mbstrlen;
} elseif( $length < 0 ){
$length = $mbstrlen + $length - 1;
}
if( $start < 0 ){
$start = $mbstrlen + $start;
}
$returnval = '';
$mbstart = 0;
$mbcount = 0;
for( $i = 0 ; $i < $strlen ; $i++ ){
if( $mbcount >= $length ){
break;
}
$currord = ord($str{$i});
if( $mbstart >= $start ){
$returnval .= $str{$i};
if( $currord > 0×7f ){
$returnval .= $str{$i+1}.$str{$i+2};
$i += 2;
}
$mbcount++;
} elseif( $currord > 0×7f ){
$i += 2;
}
$mbstart++;
}
return $returnval;
}//end function substring
//插入全文搜索分词表.一共两个,一个 topic_ft,一个bbs_ft
$arrtopicindex =& dv_chinesewordsegment($topic);
if( !empty($arrtopicindex) && is_array($arrtopicindex) ){
$topicindex = $db->escape_string(implode(' ‘,$arrtopicindex));
if( $topicindex !== ” ){
$db->query(”upd ate {$dv}topic_ft set topicindex='
{$topicindex}' where topicid='{$rootid}'”);
} else{
$db->query(”del ete from {$dv}topic_ft
where topicid='{$rootid}'”);
}
}
}

这就是所谓的mysql全文搜索分词,mysql不会分词,而php会。就这么简单。
这虽然是一种比较过时的方法,但是非常实用。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网