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实现多服务器共享SESSION数据的方法
Mar 16 PHP
php 将excel导入mysql
Nov 09 PHP
PHP中strtotime函数使用方法详解
Nov 27 PHP
深入php 正则表达式的学习探讨
Jun 06 PHP
PHP遍历某个目录下的所有文件和子文件夹的实现代码
Jun 28 PHP
php cookie名使用点号(句号)会被转换
Oct 23 PHP
phpQuery让php处理html代码像jQuery一样方便
Jan 06 PHP
php实现的简单日志写入函数
Mar 31 PHP
thinkphp多层MVC用法分析
Dec 30 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
Jan 28 PHP
php文件上传原理与实现方法详解
Dec 20 PHP
phpstudy后门rce批量利用脚本的实现
Dec 12 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
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
PHP函数学习之PHP函数点评
2012/07/05 PHP
如何利用http协议发布博客园博文评论
2015/08/03 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
php 二维数组快速排序算法的实现代码
2017/10/17 PHP
thinkPHP框架整合tcpdf插件操作示例
2018/08/07 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
2019/07/08 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
基于jQuery选择器的整理集合
2013/04/26 Javascript
jquery使用正则表达式验证email地址的方法
2015/01/22 Javascript
JS获得图片alt信息的方法
2015/04/01 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
2017/03/02 Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
2017/03/02 Javascript
AngularJS实现动态切换样式的方法分析
2018/06/26 Javascript
vuejs前后端数据交互之从后端请求数据的实例
2018/08/11 Javascript
微信小程序实现日期格式化和倒计时
2020/11/01 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
[01:21]DOTA2新纪元-7.0新版本即将开启!
2016/12/11 DOTA
Python实现的一个简单LRU cache
2014/09/26 Python
Python3中详解fabfile的编写
2018/06/24 Python
django celery redis使用具体实践
2019/04/08 Python
使用pyqt5 tablewidget 单元格设置正则表达式
2019/12/13 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
2020/09/29 Python
Python Http请求json解析库用法解析
2020/11/28 Python
linux面试题参考答案(10)
2016/10/26 面试题
师德师风演讲稿
2014/05/05 职场文书
高考标语大全
2014/06/05 职场文书
竞选班干部演讲稿600字
2014/08/20 职场文书
个人师德师风自我剖析材料
2014/09/29 职场文书
校园运动会广播稿
2014/10/06 职场文书
2019通用版导游词范本!
2019/08/07 职场文书
PyQt5实现多张图片显示并滚动
2021/06/11 Python
基于Java的MathML转图片的方法(示例代码)
2021/06/23 Java/Android
关于 Python json中load和loads区别
2021/11/07 Python
win10拖拽文件时崩溃怎么解决?win10文件不能拖拽问题解决方法
2022/08/14 数码科技