form1.cn
Make a little progress every day

sphinx + scws 中文分词全文索引代码实现

08th of March 2017 PHP PHPcode 2196

这是一个例子,站长自测可用,其中sphinx的安装,scws的安装,php的各个扩展安装等相关文章请在本站进行搜索关键字:sphinx和scws

<?php
/*
  sphinx + scws 中文分词全文索引代码实现
  /
$search = $_GET['search'];
if(empty($search)){exit;}
//========================================scws
//实例化分词插件核心类
$so = scws_new();
//设置分词时所用编码
$so->set_charset('utf8');
//设置分词所用词典(此处使用utf8的词典)
$so->set_dict('/usr/local/scws12/etc/dict.utf8.xdb');
//设置分词所用规则
$so->set_rule('/usr/local/scws12/etc/rules.utf8.ini');
//分词前去掉标点符号
$so->set_ignore(true);
//是否复式分割,如“中国人”返回“中国+人+中国人”三个词。
//取值可组合 (1)短词 (2)二元(将相邻的2个单字组合成一个词) (4)重要单字 (8)全部单字
$so->set_multi(1);
//$so->set_multi(2);
//如果为 true 则结果中多个单字会自动按二分法聚分,如果为 false 则不处理,缺省为 false
$so->set_duality(true);
//要进行分词的语句  get_result
$so->send_text($search);
//获取分词结果,如果提取高频词用get_tops方法(不需要循环调用)
//**注意** get_result每次切词后本函数应该循环调用,直到返回 false 为止,因为程序每次返回的词数是不确定的。
while ($tmp = $so->get_result()) {
    foreach($tmp as $v){$words[] = '('.$v['word'].')';}
}
$so->close();
$keyword = implode("|",$words);
//=============================================sphinx
$sphinx = new SphinxClient;
//sphinx的主机名和端口
$sphinx->setServer('127.0.0.1',9312);
//设置返回结果集为php数组格式
$sphinx->SetArrayResult ( true );
//匹配结果的偏移量,参数的意义依次为:起始位置,返回结果条数,最大匹配条数
$sphinx->SetLimits(0, 20, 1000); //可用来实现分页
//匹配所有查询词(默认模式);
$sphinx->SetMatchMode(SPH_MATCH_PHRASE);
// 使用第二版的“扩展匹配模式”对查询进行匹配.
$sphinx->SetMatchMode(SPH_MATCH_EXTENDED2);
//使用多字段模式
$sphinx->SetMatchMode(SPH_MATCH_EXTENDED);
//最大搜索时间
$sphinx->SetMaxQueryTime(10);
//执行简单的搜索,这个搜索将会查询所有字段的信息(不包括设置的属性字段)
$result = $sphinx->query($keyword,'articleindex'); //多关键词 '(配置)|(讲解)'
//索引源是配置文件中的 articleindex ,如果有多个索引源可使用,号隔开:'email,diary' 或者使用''号代表全部索引源
foreach ($result['matches'] as $key => $val){
    $id[] = $val['attrs']['aid'];
}
echo implode(',',$id);