PHP中使用Sphinx中文全文检索/搜索
Sphinx简介
sphinx是由俄国人开发的一款分词搜索软件,可以解决mysql里面的text字段做全文索引的时候分词的不足。但是需要主要是的sphinx本身只支持英文和俄文,本身是不支持中文的。有人为其开发了一个中文的常见的语言的分词包。叫做coreseek软件(理解是中文版的sphinx)。
Sphinx使用流程
1 . sphinx根据我们搜素的关键字,取mysql中获取相应的id,然后把id给我们。然后我们再根据id,到数据库中获取相应的信息。
2 . 搜索’穿越之我是帝王’,将文字发送给sphinx,然后sphinx获取其相应文章的id,再将id返回给php再根据id获取记录.
3 . 再通过id查询mysql数据库对应数据【类似这样的SQL:SELECT * FROM songs WHERE id IN (1,2,3,4,6);
流程如下:
下载安装Sphinx
1 . 解压文件,并且直接将文件放到某盘取名sphinx文件下
2 . 修改/etc目录下csft_mysql.conf文件名字为sphinx.conf,修改之后移动到sphinx目录下
3 . 每一次添加数据之后都需要将sphinx的索引重新生成,需要关机,比较麻烦,而且也影响功能的使用。这里我们采用的方法:
每一次我们只将最新添加的数据,生成索引,然后把这个新的索引和原有的索引数据进行合并.这样就可以解决这个问题.
就需要新建一个表,用于存储上一次生成索引时的最大记录id,生成新数据的索引时,就生成这条最大记录以后的数据索引.
create table sphinx
(
max_id int unsigned not null default '0'
)
4 . 更改sphinx.conf配置如下:
5 . cmd 进入bin文件下
a . 执行:indexer -c D:\phpstudy\phpStudy_64\phpstudy_pro\Sphinx\sphinx.conf 你自己表名
var目录下的data目录下会生成关于文件
b . 安装sphinx服务器:searchd -c 自己的配置文件路径 --install
c . 启动sphinx服务net start searchd
6 . 将api目录下的sphinxapi.php文件放到自己的项目当中,如下配置:
让其实例化类自动加载配置。
在Sphinx中有5种匹配模式具体自行查阅手册
1 . SPH_MATCH_ALL 匹配所有查询词
2 . SPH_MATCH_ANY 匹配查询词中的任意一个
3 . SPH_MATCH_PHRASE:将整个查询词看做一个词组,要完全匹配
4 . SPH_MATCH_BOOLEAN : 将查询看作一个布尔表达式
5 . SPH_MATCH_EXTENDED : 查询看做一个sphinx的表达式
Demo
每次添加数据后执行indexer -c D:\wamp\sphinx\etc\sphinx.conf --merge music music_add --rotate
合并新增数据索引文件和原有数据的索引文件,这样就不用重启了
<?php
header('Content-Type: application/json');
header('Content-Type: text/html;charset=utf-8');
require ('sphinxapi.php');
$s = new SphinxClient();
$s->setServer('127.0.0.1',9312);
$index='music';
$keyword = '美好的事物';
// $s->SetMatchMode(SPH_MATCH_ALL);
$res= $s -> Query($keyword,$index);
$error= $s->GetLastError();
$arr=array_keys($res['matches']);
$str=implode(',', $arr);
// print_r($str);
if($error)
{
print_r($error);
}else
{
$servername = "localhost";
$username = "d123698745";
$password = "d123698745";
$dbname='www.sp.com';
//连接mysql数据库
$li = mysqli_connect($servername,$username,$password,$dbname);
mysqli_query($li,'set names utf8');
$sql = "select * from music where id in($str)";
$res = mysqli_query($li,$sql);
//给搜索关键字添加高亮
$arr = [];
while ($re = mysqli_fetch_array($res)) {
$row = $s->buildExcerpts($re,'music', $keyword,array(
'before_match' => '<font color="red">',
'after_match' => '</font>'
));
$arr[] = $row;
}
echo '<pre />';
print_r($arr);
}
?>