在java中做全文搜索的话可以使用Lucene以及中文分词插件。在php中做全文搜素引擎可以使用Sphinx,中文分词也有很多选择,使用scws是不错的选择。scws的全称是Simple
Chinese Words
Segmentation。使用scws有三种方式:一种是使用C语言编写的scws并在源码基础上进行拓展,速度最快但是不易拓展;一种是安装scws针对php编写的插件,然后就可以直接在php中调用的scws的api函数,本文介绍的就是这种方法;最后一种是使用php重写的scws函数库,优点是不需要安装额外的插件,缺点是程序的运行效率很低。(具体信息参见http://www.ftphp.com/scws)
在php中安装完scws插件后,执行如下语句:
$str =
"在数据库中储存层次数据";
$temp = array();
$cws = scws_new();
$cws->set_multi(1);
$cws->set_charset('utf8');
$cws->send_text($str);
while ($tmp =
$cws->get_result())
{
$temp[] = $tmp;
}
$arrWhere = array();
$t = array();
foreach($temp as
$key=>$value){
foreach($value as
$item){
$t[] = $item['word'];
}
}
pirnt_r($t)
程序运行后输出:
Array
(
[0] =>
在
[1] =>
数据库
[2] =>
数据
[3] =>
中
[4] =>
储存
[5] =>
层次
[6] =>
数据
)
可以看到分词结果中有重叠的地方,通过调节$cws->set_multi(1);中参数的值可以调整分词结果的颗粒度。例如设置$cws->set_multi(2);后输出结果为:
Array
(
[0] =>
在
[1] =>
数据库
[2] =>
数据
[3] =>
据库
[4] =>
中
[5] =>
储存
[6] =>
层次
[7] =>
数据
)
使用这个中文分词插件可以做一些应用,比如交友网站上允许用户输入模糊搜索信息,用户可以输入“浙江杭州22岁有图”来搜索用户,经过分词输出数组:
Array
(
[0] =>
浙江
[1] =>
杭州
[2] =>
22
[3] =>
岁
[4] =>
有
[5] =>
图
)
再在经过一些语义分析后(进行这种限定较多的语义分析并不复杂),就可以得到对应的数据库查询条件:
select * from members where
str_provicne="浙江" and str_city="杭州" and int_age=22 and
has_pic=1