get_tops('20');print_r($tmp);$so->close();?>测试完毕,成功结果:Array ( [0] => Array ( [word] => 壮骨 [times] => 1 [weight] => 9.60000038147 [attr] => n ) [1] => Array ( [word] => 冲剂 [times] => 1 [weight] => 8.47000026703 [attr] => n ) [2] => Array ( [word] => 三九 [times] => 1 [weight] => 1 [attr] => mt ) )结果查找还没想到好方法,只好用正则试一下吧//组装正则字串,格式:(AAA|BBB|CCC|DDD)$str="(";for($i=0; $i echo $tmp[$i]['word']."";$str .=$tmp[$i]['word']."|";}//$str = substr($str, 0, -1);$str = mb_substr($str, 0, -1, "utf8");$str=$str.")";$so->close();//查询產品id$blursearch_sql = "SELECT pid FROM table WHERE (pname REGEXP '".$str."') OR (pdetail REGEXP '".$str."')";echo $blursearch_sql;理论上可用了,但查询效率不高,勉强使用吧!,风一样的男孩's Blog - 创造机会的人是勇者;等待机会的人是愚者" /> PHP和SWCS组合实现中文模糊搜索 - 风一样的男孩's Blog

PHP和SWCS组合实现中文模糊搜索

中文模糊搜索中最难的就是如何分词了,好像网上很多人推荐Lucene和sphinx,lucene是java的,而我目前的项目是PHP,鬱闷!SPhinx要重新编译PHP,好像还是在linux下,还要架设编程环境,项目时间紧张,待下一版本再考虑SPhinx吧,找来找去找到了SCWS,之所以用它,是因為有人為它写了PHP扩展,可以拿来就用啊
我的使用环境:APMServ5.2.6套件,全站UTF8
下面记录一下流程,免得那天又忘了
首先下载工具:
网址:http://www.ftphp.com/scws/download.php
因為全站使用UTF8编码,就下载了utf8的全套工具
PHP扩展库php_scws.dll,字典文件XDB 词典文件,主体类和规则库PSCWS4
下完就开始配置唄
把PHP扩展库放入PHP的扩展目录/PHP/Ext中
修改PHP.ini
;中文分词插件
extension=php_scws.dll
;设定字符集,也可在使用时配置
scws.default.charset = utf8
还可以在php.ini中配置规则库地址,但我更喜欢在使用时配置,尽量少动php.ini吧
重啟Apache
使用php -mod在命令行先查看SCWS模块是否加载。
新添点说明:
主要需要:xdb_r.class.php,pscws4.class.php, /etc/rules.utf8.ini, dict.utf8.xdb这几个文件
我把字典文件 dict.utf8.xdb 也放在etc目录下了,
所以文件机构图
|__ test.php
|__ pscws4.class.php
|__xdb_r.class.php
|__etc
|___rules.utf8.ini
|___dict.utf8.xdb
下面写个测试页面test.php
require_once(' pscws4.class.php ');
$so = scws_new();
$so->set_charset('utf8');
$so->set_dict('./etc/dict.utf8.xdb');
$so->set_rule('./etc/rules.utf8.ini');
// 这里若不调用 set_dict 和 set_rule 系统会自动试调用 ini 中指定路径下的词典和规则文件
$so->send_text("我想买三九壮骨冲剂?");
//这里是提取权重最高的前20名,还有其他函数要用去看手册了
$tmp = $so->get_tops('20');
print_r($tmp);
$so->close();
?>
测试完毕,成功
结果:
Array ( [0] => Array ( [word] => 壮骨 [times] => 1 [weight] => 9.60000038147 [attr] => n ) [1] => Array ( [word] => 冲剂 [times] => 1 [weight] => 8.47000026703 [attr] => n ) [2] => Array ( [word] => 三九 [times] => 1 [weight] => 1 [attr] => mt ) )
结果查找还没想到好方法,只好用正则试一下吧
//组装正则字串,格式:(AAA|BBB|CCC|DDD)
$str="(";
for($i=0; $i echo $tmp[$i]['word']."
";
$str .=$tmp[$i]['word']."|";
}
//$str = substr($str, 0, -1);
$str = mb_substr($str, 0, -1, "utf8");
$str=$str.")";
$so->close();
//查询產品id
$blursearch_sql = "Select pid FROM table Where (pname REGEXP '".$str."') or (pdetail REGEXP '".$str."')";
echo $blursearch_sql;
理论上可用了,但查询效率不高,勉强使用吧!


文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: php
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.