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 相关文章推荐
用js进行url编码后用php反解以及用php实现js的escape功能函数总结
Feb 08 PHP
在PHP中实现Javascript的escape()函数代码
Aug 08 PHP
PHP判断表单复选框选中状态完整例子
Jun 24 PHP
PHP生成图片验证码、点击切换实例
Jun 25 PHP
PHP SPL标准库之接口(Interface)详解
May 11 PHP
php邮箱地址正则表达式验证
Nov 13 PHP
深入浅析php中sprintf与printf函数的用法及区别
Jan 08 PHP
thinkPHP简单遍历数组方法分析
May 16 PHP
PHP实现二维数组根据key进行排序的方法
Dec 30 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 PHP
Laravel向公共模板赋值方法总结
Jun 25 PHP
Laravel框架实现的上传图片到七牛功能详解
Sep 06 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开发中四种查询返回结果分析
2011/01/02 PHP
一个简单的php加密解密函数(动态加密)
2013/06/19 PHP
php几个预定义变量$_SERVER用法小结
2014/11/07 PHP
php 使用array函数实现分页
2015/02/13 PHP
PHP下用Swoole实现Actor并发模型的方法
2019/06/12 PHP
js中单引号与双引号冲突问题解决方法
2013/10/04 Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
2015/03/13 Javascript
自己动手写的javascript前端等待控件
2015/10/30 Javascript
AngularJS监听路由的变化示例代码
2016/09/23 Javascript
关于js函数解释(包括内嵌,对象等)
2016/11/20 Javascript
AngularJS select加载数据选中默认值的方法
2018/02/28 Javascript
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
微信小程序webview 脚手架使用详解
2019/07/22 Javascript
ES6中异步对象Promise用法详解
2019/07/31 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
2020/06/25 Javascript
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
Python中基本的日期时间处理的学习教程
2015/10/16 Python
Python编写合并字典并实现敏感目录的小脚本
2019/02/26 Python
python对象与json相互转换的方法
2019/05/07 Python
python3图片文件批量重命名处理
2019/10/31 Python
python中property和setter装饰器用法
2019/12/19 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
2020/02/25 Python
如何在python中执行另一个py文件
2020/04/30 Python
python实现爱奇艺登陆密码RSA加密的方法示例详解
2020/05/27 Python
Python读取yaml文件的详细教程
2020/07/21 Python
纯CSS3实现表单验证效果(非常不错)
2017/01/18 HTML / CSS
html5 canvas实现圆形时钟代码分享
2013/12/25 HTML / CSS
马来西亚在线购物:POPLOOK.com
2019/12/09 全球购物
初中化学教学反思
2014/01/23 职场文书
建议书标准格式
2014/03/12 职场文书
珠宝的促销活动方案
2014/08/31 职场文书
公务员个人总结
2015/02/12 职场文书
2016党员学习作风建设心得体会
2016/01/21 职场文书
Python必备技巧之函数的使用详解
2022/04/04 Python
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
2022/12/24 MySQL