php启用sphinx全文搜索的实现方法


Posted in PHP onDecember 24, 2014

本文实例讲述了php启用sphinx全文搜索的实现方法。分享给大家供大家参考。具体分析如下:

在编译安装 sphinx 的时候出现很多中文乱码,最后抛出错误卡住了,我去到官方直接下载一个 rpm 包,安装就很爽,具体错误不想研究了,忙开发呢.

安装两个包,一个是 mmseg 这个是生成中文字典的程序,一个是  csft 也就是中国版的sphinx .

rpm -ivh 安装完以后,很顺利~~不到半分钟就装完了.

中文字典库,我直接去 csft 官方下载了,挺好的想得很周到.

unigram.txt  uni.lib

unigram.txt  字典文本,可以在里面添加你自己的关键字.

然后使用:mmseg -u unigram.txt 生成字典文件:unigram.txt.uni 然后重命名一下  uni.lib 这个就是sphinx 认识的字典了.

放哪里?放你在 sphinx.conf 里面配置的字典路径里面,等会说到,然后基本就差不多了,在看下sphinx 几个实用的程序:

[root@beihai365 /]# csft-
csft-indexer  csft-search   csft-searchd

csft-indexer  是生成全文搜索索引的 程序

csft-search  是测试搜索是否生效用的,也很好用,不如我还没用客户端脚本开发,就可以用这个来查看全文搜索是否成功

csft-searchd  这个就是 sphinx 搜索的守护程序了。 启动以后,就可以用脚本 php python 等,开查询了。

就那么简单,在看下关键的两部分东西.

sphinx.conf 配置文件:

source tmsgs    

{    

        type                                    = mysql    

        sql_host                                = localhost    

        sql_user                                = root    

        sql_pass                                = 1    

        sql_db                                  = phpwind75sp3    

        sql_port                                = 3306  # optional, default is 3306    

        #sql_sock                                = /tmp/mysql3307.sock    

        sql_query_pre                           = SET NAMES gbk    

        sql_query                               = SELECT id,name,type,stock FROM pw_tools    

        #sql_attr_uint                          = id    

        sql_attr_uint                           = stock    

}    

   

index tmsgsindex    

{    

        source                                  = tmsgs    

        path                                    = /var/mmseg/searchdata/beihai365    

        docinfo                                 = extern    

        charset_type                            = zh_cn.gbk    

        #min_prefix_len  = 0    

        #min_infix_len  = 2    

        #ngram_len = 2    

        charset_dictpath                        = /var/mmseg/data    

        #min_prefix_len                          = 0    

        #min_infix_len                           = 0    

        #min_word_len                            = 2    

}    

   

indexer    

{    

        mem_limit                               = 128M    

}    

   

searchd    

{    

        #listen                                = 3312    

        log                                 = /var/log/searchd.log    

        query_log                           = /var/log/query.log    

        read_timeout                        = 5    

        max_children                        = 30    

        pid_file                            = /var/log/searchd.pid    

        max_matches                         = 1000    

        #seamless_rotate                     = 1    

        #preopen_indexes                     = 0    

        #unlink_old                          = 1    

}   

source tmsgs 

{ 

        type                                    = mysql 

        sql_host                                = localhost 

        sql_user                                = root 

        sql_pass                                = 1 

        sql_db                                  = phpwind75sp3 

        sql_port                                = 3306  # optional, default is 3306 

        #sql_sock                                = /tmp/mysql3307.sock 

        sql_query_pre                           = SET NAMES gbk 

        sql_query                               = SELECT id,name,type,stock FROM pw_tools 

        #sql_attr_uint                          = id 

        sql_attr_uint                           = stock 

} 

index tmsgsindex 

{ 

        source                                  = tmsgs 

        path                                    = /var/mmseg/searchdata/beihai365 

        docinfo                                 = extern 

        charset_type                            = zh_cn.gbk 

        #min_prefix_len  = 0 

        #min_infix_len  = 2 

        #ngram_len = 2 

        charset_dictpath                        = /var/mmseg/data 

        #min_prefix_len                          = 0 

        #min_infix_len                           = 0 

        #min_word_len                            = 2 

} 

indexer 

{ 

        mem_limit                               = 128M 

} 

searchd 

{ 

        #listen                                = 3312 

        log                                 = /var/log/searchd.log 

        query_log                           = /var/log/query.log 

        read_timeout                        = 5 

        max_children                        = 30 

        pid_file                            = /var/log/searchd.pid 

        max_matches                         = 1000 

        #seamless_rotate                     = 1 

        #preopen_indexes                     = 0 

        #unlink_old                          = 1 

}

再看一下,测试客户端代码:
<?php    

    header("Content-type:text/html;charset=utf-8");    

    include 'sphinxapi.php';    

    $cl = new SphinxClient();    

    $cl->SetServer('localhost',3312);    

    $cl->SetMatchMode(SPH_MATCH_ALL);    

    $cl->SetArrayResult(true);    

    $res = $cl->Query("名卡","*");    

    print_r($res);    

?>   

<?php 

header("Content-type:text/html;charset=utf-8"); 

include 'sphinxapi.php'; 

$cl = new SphinxClient(); 

$cl->SetServer('localhost',3312); 

$cl->SetMatchMode(SPH_MATCH_ALL); 

$cl->SetArrayResult(true); 

$res = $cl->Query("名卡","*"); 

print_r($res); 

?>

“名卡”这个关键字是我自己手动在字典里面添加的,看是否能真的搜到,实例代码如下:
Array    

(    

    [error] =>     

    [warning] =>     

    [status] => 0    

    [fields] => Array    

        (    

            [0] => name    

            [1] => type    

        )    

   

    [attrs] => Array    

        (    

            [stock] => 1    

        )    

   

    [matches] => Array    

        (    

            [0] => Array    

                (    

                    [id] => 8    

                    [weight] => 1    

                    [attrs] => Array    

                        (    

                            [stock] => 100    

                        )    

                )    

        )    

    [total] => 1    

    [total_found] => 1    

    [time] => 0.018    

    [words] => Array    

        (    

            [名卡] => Array    

                (    

                    [docs] => 1    

                    [hits] => 1    

                )    

        )    

)   

Array 

( 

    [error] =>  

    [warning] =>  

    [status] => 0 

    [fields] => Array 

        ( 

            [0] => name 

            [1] => type 

        ) 

    [attrs] => Array 

        ( 

            [stock] => 1 

        ) 

    [matches] => Array 

        ( 

            [0] => Array 

                ( 

                    [id] => 8 

                    [weight] => 1 

                    [attrs] => Array 

                        ( 

                            [stock] => 100 

                        ) 

                ) 

        ) 

    [total] => 1 

    [total_found] => 1 

    [time] => 0.018 

    [words] => Array 

        ( 

            [名卡] => Array 

                ( 

                    [docs] => 1 

                    [hits] => 1 

                ) 

        ) 

)

完全没问题,搜索出来了,几个关键的操作:
[root@beihai365 /]# csft-searchd --stop 停止搜索守护

[root@beihai365 /]# csft-indexer --all 针对所有节点生成索引,你也可以针对某个节点生成索引比如:csft-indexer  xx

[root@beihai365 /]# csft-search App 搜索关键字 App,不过看下面信息没有搜到和没有命中任何的文档.

Coreseek Full Text Server 3.1
Copyright (c) 2006-2008 coreseek.com
using config file './csft.conf'...
1,
pt:1, 1;        index 'tmsgsindex': query 'App ': returned 0 matches of 0 total in 0.017 sec
words:
1. 'app': 0 documents, 0 hits
当大家在运行这些命令的时候发现,需要你自己手动的置顶 --config  sphinx.conf   配置文件的路径,很不方便,所以我干脆 ln -s 一个在 ./,这样不用每次都去敲入  --config.

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
php操作xml
Oct 27 PHP
PHP中spl_autoload_register()和__autoload()区别分析
May 10 PHP
php上传图片之时间戳命名(保存路径)
Aug 15 PHP
php实现根据字符串生成对应数组的方法
Sep 22 PHP
自己写的兼容低于PHP 5.5版本的array_column()函数
Oct 24 PHP
php实现插入数组但不影响原有顺序的方法
Mar 27 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
Oct 09 PHP
PHP汉字转换拼音的函数代码
Dec 30 PHP
Laravel框架实现发送短信验证功能代码
Jun 06 PHP
Yii2实现上下联动下拉框功能的方法
Aug 10 PHP
PHP多维数组指定多字段排序的示例代码
May 16 PHP
php微信公众号开发之快递查询
Oct 20 PHP
php中mail函数发送邮件失败的解决方法
Dec 24 #PHP
微信公众平台接口开发入门示例
Dec 24 #PHP
PHP获取youku视频真实flv文件地址的方法
Dec 23 #PHP
php实现refresh刷新页面批量导入数据的方法
Dec 23 #PHP
微信公众平台开发关注及取消关注事件的方法
Dec 23 #PHP
php打印输出棋盘的实现方法
Dec 23 #PHP
php新浪微博登录接口用法实例
Dec 23 #PHP
You might like
如何在PHP程序中防止盗链
2008/04/09 PHP
一步一步学习PHP(7) php 字符串相关应用
2010/03/05 PHP
php实现文件下载更能介绍
2012/11/23 PHP
php使用正则过滤js脚本代码实例
2014/05/10 PHP
php中base64_decode与base64_encode加密解密函数实例
2014/11/24 PHP
Yii隐藏URL中index.php的方法
2016/07/12 PHP
Google Map Api和GOOGLE Search Api整合实现代码
2009/07/18 Javascript
JavaScript setTimeout和setInterval的使用方法 说明
2010/03/25 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
深入解析JavaScript中的数字对象与字符串对象
2015/10/21 Javascript
浅谈JS继承_借用构造函数 &amp; 组合式继承
2016/08/16 Javascript
Vue.js实战之使用Vuex + axios发送请求详解
2017/04/04 Javascript
微信小程序图片选择区域裁剪实现方法
2017/12/02 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
vue ajax 拦截原理与实现方法示例
2019/11/29 Javascript
.netcore+vue 实现压缩文件下载功能
2020/09/24 Javascript
[05:05]给小松五分钟系列 第二期介绍为什么打DOTA2
2014/07/02 DOTA
[00:32]2018DOTA2亚洲邀请赛VG出场
2018/04/03 DOTA
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
python抽象基类用法实例分析
2015/06/04 Python
以一个投票程序的实例来讲解Python的Django框架使用
2016/02/18 Python
在django中使用apscheduler 执行计划任务的实现方法
2020/02/11 Python
python通用读取vcf文件的类(复制粘贴即可用)
2020/02/29 Python
基于python检查SSL证书到期情况代码实例
2020/04/04 Python
python实现单机五子棋
2020/08/28 Python
毕业自我鉴定范文
2013/11/06 职场文书
信息技术毕业生自荐信范文
2014/03/13 职场文书
软件专业毕业生个人自我鉴定
2014/04/17 职场文书
个人合作协议书范本
2014/04/18 职场文书
幼儿教师2014年度工作总结
2014/12/16 职场文书
幼儿园工作总结2015
2015/04/01 职场文书
二婚主持词
2015/06/30 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技