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和XSS跨站攻击的防范
Apr 17 PHP
php 分页原理详解
Aug 21 PHP
关于尾递归的使用详解
May 02 PHP
phpmyadmin出现Cannot start session without errors问题解决方法
Aug 14 PHP
PHP模板引擎smarty详细介绍
May 26 PHP
实例简介PHP的一些高级面向对象编程的特性
Nov 27 PHP
微信支付PHP SDK之微信公众号支付代码详解
Dec 09 PHP
PHP基于SimpleXML生成和解析xml的方法示例
Jul 17 PHP
PHP文件上传小程序 适合初学者学习!
May 23 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
Nov 10 PHP
PHP解决高并发的优化方案实例
Dec 10 PHP
swoole锁的机制代码实例讲解
Mar 04 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编码规范之注释和文件结构说明
2010/07/09 PHP
php设计模式 Visitor 访问者模式
2011/06/28 PHP
php简单浏览目录内容的实现代码
2013/06/07 PHP
php实现ip白名单黑名单功能
2015/03/12 PHP
PHP中预定义的6种接口介绍
2015/05/12 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
2016/01/27 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
php输出文字乱码的解决方法
2019/10/04 PHP
javascript实现数字验证码的简单实例
2014/02/10 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
jQuery实现弹出窗口中切换登录与注册表单
2015/06/05 Javascript
用JS中split方法实现彩色文字背景效果实例
2016/08/24 Javascript
最细致的vue.js基础语法 值得收藏!
2016/11/03 Javascript
javascript编程开发中取色器及封装$函数用法示例
2017/08/09 Javascript
JavaScript闭包原理与用法实例分析
2018/08/10 Javascript
JavaScript数组去重的方法总结【12种方法,号称史上最全】
2019/02/28 Javascript
React组件对子组件children进行加强的方法
2019/06/23 Javascript
JS面向对象之单选框实现
2020/01/17 Javascript
JavaScript setTimeout()基本用法有哪些
2020/11/04 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
Python入门篇之对象类型
2014/10/17 Python
Python中join函数简单代码示例
2018/01/09 Python
Python enumerate索引迭代代码解析
2018/01/19 Python
python 用opencv调用训练好的模型进行识别的方法
2018/12/07 Python
Python生成器generator原理及用法解析
2020/07/20 Python
德国的大型美妆个护电商:Flaconi
2020/06/26 全球购物
请说出以下代码输出什么
2013/08/30 面试题
最新英语专业学生求职信范文
2013/09/21 职场文书
学生思想表现的评语
2014/01/30 职场文书
法学专业毕业实习自我鉴定2014
2014/09/27 职场文书
会计试用期工作总结2015
2015/05/28 职场文书
实验室安全管理制度
2015/08/05 职场文书
适合青年人白手起家的创业项目分享
2019/08/16 职场文书
深入详解JS函数的柯里化
2021/06/09 Javascript
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android