vlambda博客
学习文章列表

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文件下
PHP中使用Sphinx中文全文检索/搜索

2 . 修改/etc目录下csft_mysql.conf文件名字为sphinx.conf,修改之后移动到sphinx目录下

3 . 每一次添加数据之后都需要将sphinx的索引重新生成,需要关机,比较麻烦,而且也影响功能的使用。这里我们采用的方法:

 
   
   
 
  1. 每一次我们只将最新添加的数据,生成索引,然后把这个新的索引和原有的索引数据进行合并.这样就可以解决这个问题.

  2. 就需要新建一个表,用于存储上一次生成索引时的最大记录id,生成新数据的索引时,就生成这条最大记录以后的数据索引.

  3. create table sphinx

  4. (

  5. max_id int unsigned not null default '0'

  6. )

4 . 更改sphinx.conf配置如下:
PHP中使用Sphinx中文全文检索/搜索
PHP中使用Sphinx中文全文检索/搜索

5 . cmd 进入bin文件下

a . 执行:indexer -c D:\phpstudy\phpStudy_64\phpstudy_pro\Sphinx\sphinx.conf 你自己表名
var目录下的data目录下会生成关于PHP中使用Sphinx中文全文检索/搜索文件

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
合并新增数据索引文件和原有数据的索引文件,这样就不用重启了

 
   
   
 
  1. <?php

  2. header('Content-Type: application/json');

  3. header('Content-Type: text/html;charset=utf-8');

  4. require ('sphinxapi.php');

  5. $s = new SphinxClient();

  6. $s->setServer('127.0.0.1',9312);

  7. $index='music';

  8. $keyword = '美好的事物';

  9. // $s->SetMatchMode(SPH_MATCH_ALL);

  10. $res= $s -> Query($keyword,$index);

  11. $error= $s->GetLastError();

  12. $arr=array_keys($res['matches']);

  13. $str=implode(',', $arr);

  14. // print_r($str);

  15. if($error)

  16. {

  17. print_r($error);

  18. }else

  19. {

  20. $servername = "localhost";

  21. $username = "d123698745";

  22. $password = "d123698745";

  23. $dbname='www.sp.com';

  24. //连接mysql数据库

  25. $li = mysqli_connect($servername,$username,$password,$dbname);

  26. mysqli_query($li,'set names utf8');

  27. $sql = "select * from music where id in($str)";

  28. $res = mysqli_query($li,$sql);

  29. //给搜索关键字添加高亮

  30. $arr = [];

  31. while ($re = mysqli_fetch_array($res)) {

  32. $row = $s->buildExcerpts($re,'music', $keyword,array(

  33. 'before_match' => '<font color="red">',

  34. 'after_match' => '</font>'

  35. ));

  36. $arr[] = $row;

  37. }

  38. echo '<pre />';

  39. print_r($arr);

  40. }

  41. ?>