sphnix 中文划词搜索技术

首先要建立一个配置文件,比如叫sphinx.conf,这个配置文件的模板可以在etc目录下找到,链接mysql的话,就用csft_mysql.conf这个文件来修改就行

 1 #源定义
 2 source songs
 3 {
 4     type                    = mysql
 5 
 6     sql_host                = localhost
 7     sql_user                = root
 8     sql_pass                = 
 9     sql_db                    = test
10     sql_port                = 3306
11     sql_query_pre            = SET NAMES utf8
12 
13     sql_query                = select id,title,content from curl_songs
14                                                               #sql_query第一列id需为整数
15                                                               #title、content作为字符串/文本字段,被全文索引
16     #sql_attr_uint            = group_id           #从SQL读取到的值必须为整数
17     #sql_attr_timestamp        = date_added #从SQL读取到的值必须为整数,作为时间属性
18 
19     sql_query_info_pre      = SET NAMES utf8                                        #命令行查询时,设置正确的字符集
20     sql_query_info            = SELECT * FROM documents WHERE id=$id #命令行查询时,从数据库读取原始数据信息
21 }
22 
23 #index定义
24 index songs
25 {
26     source            = songs             #对应的source名称
27     path            = F:wampinsphinxcoreseek-3.2.14-win32vardatasongs #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
28     docinfo            = extern
29     mlock            = 0
30     morphology        = none
31     min_word_len        = 1
32     html_strip                = 0
33 
34     #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
35     #charset_dictpath = F:wampinsphinxcoreseek-3.2.14-win32etc #BSD、Linux环境下设置,/符号结尾
36     charset_dictpath = F:wampinsphinxcoreseek-3.2.14-win32etc                             #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
37     charset_type        = zh_cn.utf-8
38 }
39 
40 #全局index定义
41 indexer
42 {
43     mem_limit            = 128M
44 }
45 
46 #searchd服务定义
47 searchd
48 {
49     listen                  =   9312
50     read_timeout        = 5
51     max_children        = 30
52     max_matches            = 1000
53     seamless_rotate        = 0
54     preopen_indexes        = 0
55     unlink_old            = 1
56     pid_file = F:wampinsphinxcoreseek-3.2.14-win32varlogsearchd_mysql.pid  #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
57     log = F:wampinsphinxcoreseek-3.2.14-win32varlogsearchd_mysql.log        #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
58     query_log = F:wampinsphinxcoreseek-3.2.14-win32varlogquery_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
59 }

之后,在每次使用之前,必须启动sphinx的服务
即bin文件下的searchd,启动时,要携带配置文件,命令如下

1 F:wampinsphinxcoreseek-3.2.14-win32insearchd.exe
2 -c F:wampinsphinxcoreseek-3.2.14-win32sphinx.conf

这样sphinx就启动了,

然后,对要进行查询的数据源文件,必须建立好索引,需要用到sphinx bin下面的indexer文件

C:UsersAdministrator>F:wampinsphinxcoreseek-3.2.14-win32inindexer.exe
-c F:wampinsphinxcoreseek-3.2.14-win32sphinx.conf songs --all

然后就可以用php才操作sphinx了

 1 <?php
 2 //引入sphinx api类
 3 include 'sphinxapi.php';
 4 $s=new SphinxClient();
 5 $s->SetServer('localhost',9312);
 6 //设置搜索的内容,word
 7 $word=empty($_GET['search']) ? '' : $_GET['search'];
 8 //执行查询,songs为数据源的名字
 9 $res=$s->Query($word,'songs');
10 if($res){
11     //list里面存储查询到的id
12     $list=array_keys($res['matches']);
13     $list=implode(',', $list);
14     
15     
16     //开始mysql查询部分
17     mysql_connect('localhost','root','',3306);
18     mysql_select_db('test');
19     $sql="select * from curl_songs where id in ($list)";
20     mysql_query('set names utf8');
21     $res=mysql_query($sql) or die(mysql_error());
22     
23     while ($row=mysql_fetch_assoc($res)){
24         //这个buildExcerpts方法,可以对结果进行文档标注,比如对搜到的关键字进行红色标注,比较实用
25         //但实用之后,结果的数据就不是关联数组了,就成为索引数组,要用arr[0] arr[1]等来取值
26         $arr[]=$s->BuildExcerpts($row, 'songs', $word, array(
27         'before_match'=>'<font color="red">',
28         'after_match'=>'</font>',
29         'limit'=>'200'
30         ));
31     }
32     
33 }
34 //总共消耗的时间
35     $costtime=empty($res['time']) ?'0.00' : $res['time'];
36 //一共查询到了多少条
37     $totalfound=empty($res['total_found']) ? '0' : $res['total_found'];
38 //页面显示部分    
39 ?>
40 <html>
41 <meta charset='utf-8'></meta>
42 <body>
43 <form method='get' >
44 <input type='text' name='search' value="<?php echo $word ?>" />  <button >搜索</button> <br>
45 共有<?php echo $totalfound ?>条记录,消耗时间<?php echo $costtime ?>46 
47 <?php 
48 if (!empty($arr)) {
49     echo "<ul>";
50     foreach ($arr as $v){
51     echo '<li><hr>'.$v[1] .' 演唱:'.$v[2].'</li>';
52     echo '<li><p>'. $v[3] .'</p><br></li></ul>';
53     }
54 }
55 ?>
56 </form>
57 </body>
58 </html>

 --->sphinx应用后对应有个增量索引的东西,就是索引建立好后,当数据有更新,如果每次重新生成索引相当的费时不现实

步骤,主数据源为songs 增加的为songs_add

首先要在mysql下建立一张表,目的存储songs这个索引的最大id,其实就是相当于一个变量的作用

1 create table a(
2 id int unsigned primary key ,max_id int unsigned default ''
3 )

然后就是修改sphinx.conf这个文件,首先
在原来的数据源 songs 中 要加入这一句

 意思就是在主查询完毕之后,插入songs表最大的id到a表中记录好,replace作用是无数据就插入,有数据就更新

1 sql_query = select id,title,content from curl_songs
2 sql_query_post = replace into a select 1,max(id) from curl_songs

然后建立songs_add部分的数据源和索引

 1 #源定义
 2 source songs_add
 3 {
 4     type                    = mysql
 5 
 6     sql_host                = localhost
 7     sql_user                = root
 8     sql_pass                = 
 9     sql_db                    = test
10     sql_port                = 3306
11     sql_query_pre            = SET NAMES utf8
12 
13     sql_query                = select id,title,content from curl_songs where id >( select max_id from a)
14     sql_query_post           =replace into a select 1,max(id) from curl_songs
15 
16 
17     sql_query_info_pre      = SET NAMES utf8                             #命令行查询时,设置正确的字符集
18     sql_query_info            = SELECT * FROM documents WHERE id=$id #命令行查询时,从数据库读取原始数据信息
19 }
20 
21 #index定义
22 index songs_add
23 {
24     source            = songs_add             #对应的source名称
25     path            = F:wampinsphinxcoreseek-3.2.14-win32vardatasongs_add #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
26     docinfo            = extern
27     mlock            = 0
28     morphology        = none
29     min_word_len        = 1
30     html_strip                = 0
31 
32     #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
33     #charset_dictpath = F:wampinsphinxcoreseek-3.2.14-win32etc #BSD、Linux环境下设置,/符号结尾
34     charset_dictpath = F:wampinsphinxcoreseek-3.2.14-win32etc                             #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
35     charset_type        = zh_cn.utf-8
36 }

配置文件设置好之后就开始运行
(1):生成songs的索引(必须重新生成一次,这样a表中就会记录最大id)

1 F:wampinsphinxcoreseek-3.2.14-win32inindexer.exe
2 -c F:wampinsphinxcoreseek-3.2.14-win32sphinx.conf songs

(2):生成songs_add的索引

1 F:wampinsphinxcoreseek-3.2.14-win32inindexer.exe
2 -c F:wampinsphinxcoreseek-3.2.14-win32sphinx.conf songs_add

(3)合并这两个索引即可

1 F:wampinsphinxcoreseek-3.2.14-win32inindexer.exe
2 -c F:wampinsphinxcoreseek-3.2.14-win32sphinx.conf --merge songs song_add --rotate

可以设置一个自动的脚本或linux下的计划任务,让索引更新在比如每天晚上2天自动更新

原文地址:https://www.cnblogs.com/dk1988/p/3524561.html