mysql全文搜索的sql命令的编写
比赛(COL1,COL2,…对(expr)查询扩展布尔模型| } {)
例如:
SELECT * FROM文章匹配(标题、主体)对('database);
比赛()函数执行一个自然语言搜索数据库中的一个字符串。数据库是包含在全文1套1或2列。搜索字符串作为参数对(),表中的所有行,匹配()返回一个值,是相关的,搜索字符串并在比赛中指定列的文本之间的相似性度量表()。
下面的例子更复杂。请求的返回值,同时在线根据序列相关性渐弱。要做到这一点,你应该指定匹配()两次:一个选择列表和WHERE子句中其他。这并不会造成额外的内部操作。原因是MySQL优化器注意到两个匹配()调用是相同的,只激活一个全文搜索代码。
复制代码代码如下所示:
选择id、主体、匹配
(标题、正文)反对
(安全- >的启示
作为根运行MySQL作为得分
匹配> >的文章
(标题、正文)反对
Implications ('Security - > of
运行MySQL作为root;
所以,你应该在MySQL英文全文搜索这里。
请注意一个问题。
全文搜索中将忽略一些词:
*任何一个太短的单词都会被忽略。全文搜索所能找到的单词的最小长度为4个字符。
*停止单词中的单词被忽略。
MySQL还带有查询扩展功能。这里没什么讨论。
PHP中文全文检索分析
有一个版本的MySQL支持中文全文搜索(海量MySQL中文+,GPL,但最终没有开放源码)
中文全文搜索的关键是,MySQL本身不支持CJK的分词(CJK:中国,日本,韩国)的分词。
因此
!!!如何使用PHP来模拟分词是MySQL全文索引的关键!!!!!!
汉语分词是分词中最困难的一个。没有人能完全和完美地解决它(尽管这些搜索引擎做得很好)。
复制代码代码如下所示:
/ / fcicq:下面告诉你如何PHP分词是在这里完成的。
功能dv_chinesewordsegment($str,encodingname美元= 'gbk){
静态objenc美元= null;
如果($ objenc = null){
如果(!Class_exists ('DV_Encoding')) {
require_once root_path。'inc / dv_encoding PHP。类;
}
objenc美元= dv_encoding::getencoding($ encodingname);
}
美元objenc -> strlength strlen = $($str);
returnval美元=阵();
如果($ strlen <= 1){
返回$ STR;
}
arrstopwords美元= dv_getstopwordlist();
/ / print_r($ arrstopwords);
过滤所有HTML标记
$str = preg_replace(' # | #,$str);
所有的词 / /过滤器
$str = str_replace($ arrstopwords { 'strrepl},,$str);
$str = preg_replace($ arrstopwords { 'pregrepl},,$str);
返回值
;
$ ARR =爆炸(,$str);
/ / fcicq:好了,下面是PHP关键字*************
foreach($ ARR达Javascript){
如果(preg_match( / ^ { x00-x7f } + $ /我为Javascript)= 1)
{ / / fcicq:都是E,不管,MySQL可以知道
returnval美元{ } = '$ Javascript;
}否则{ / / fcicq:中文和英文。
preg_match_all( /(({ a-za-z } +)/我,Javascript美元,$匹配);
如果(!空($matches)){ / / fcicq:英文部分
foreach($matches { 0 }达比赛){
returnval { } =对应美元美元;
}
}
ASCII字符
Javascript美元= preg_replace( /({ x00-x7f } +)/我,
Javascript美元); / / fcicq:,你看,剩下的是并不是所有的中国人。
美元objenc -> strlength strlen = $($ Javascript)- 1;
为($我= 0;$i < strlen美元美元;i++){
returnval美元{ } = $ objenc ->子串($ Javascript,我,2)
/ / fcicq:注意这里的函数,没有手册。
/ / fcicq:你仔细看,所有的话都分为两。
诸如数据库之类的应用程序将根据库应用程序划分为数据…
全文:全文搜索搜索
这个词不自然。
但是,当搜索时,执行同样的操作。
例如,搜索数据库相当于根据库搜索数据。
这是一个相当传统的文本搜索分词方法。
}
}
}
返回的returnval;
} / /结束功能dv_chinesewordsegment
/ / fcicq:这就是传说中的子串。我相信很多人写PHP代码比这个更好。
功能的子串($str,美元美元开始,长度= null){
如果(!is_numeric($开始)){
返回false;
}
$ strlen = strlen(str);
如果($ strlen <= 0){
返回false;
}
如果($开始< 0 | | $长度<0){
mbstrlen美元=美元-> strlength($str);
别的{ }
mbstrlen美元= $ strlen;
}
如果(!is_numeric($长度)){
$length = $mbStrLen;
} elseif($长度<0){
美元美元美元mbstrlen +长度长度= 1;
}
如果($开始0){
美元美元美元开始= mbstrlen +开始;
}
returnval美元=;
mbstart = 0美元;
mbcount = 0美元;
为($我= 0;$i < strlen美元美元;i++){
如果($ mbcount = $长度){
打破;
}
$currOrd = ord ($str{$i});
如果($ mbstart = $开始){
returnval美元= str {我};
如果($ currord > 0×7F){
returnval美元= str { $我+ 1 }。$str { $我+ 2 };
$ I = 2;
}
mbcount美元+ +;
} elseif($ currord > 0×7F){
$ I = 2;
}
mbstart美元+ +;
}
返回的returnval;
} / /结束功能的子串
插入/全文搜索word表单。一共有两个,一个topic_ft,一bbs_ft
arrtopicindex美元= dv_chinesewordsegment($话题);
如果(!空(arrtopicindex美元(美元)is_array arrtopicindex)){
topicindex美元=美元DB -> escape_string(崩溃('',arrtopicindex美元));
如果($ topicindex = = {!)
为数据库->查询(UPD吃{ $ DV } topic_ft集topicindex =)
{ }:随着topicindex美元={ })rootid美元;
别的{ }
为数据库->查询(DEL ETE从{ $ DV } topic_ft)
而随着={ })rootid美元;
}
}
}
这就是所谓的MySQL全文搜索分词,MySQL不会是分词,而php则会。
这是过时的方法,但很实用。