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 相关文章推荐
一个很方便的 XML 类!!原创的噢
Oct 09 PHP
消息持续发送的完整例子
Oct 09 PHP
深入PHP FTP类的详解
Jun 13 PHP
php动态变量定义及使用
Jun 10 PHP
php如何获取文件的扩展名
Oct 28 PHP
PHP获取当前文件的父目录方法汇总
Jul 21 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
Feb 08 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
Mar 25 PHP
Laravel学习教程之View模块详解
Sep 18 PHP
Laravel中unique和exists验证规则的优化详解
Jan 28 PHP
windows环境下使用Composer安装ThinkPHP5
May 18 PHP
php下的原生ajax请求用法实例分析
Feb 28 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 向访客和爬虫显示不同的内容
2009/11/09 PHP
PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
2012/04/09 PHP
[原创]php获取数组中键值最大数组项的索引值
2015/03/17 PHP
PHP中Enum(枚举)用法实例详解
2015/12/07 PHP
php中通过eval实现字符串格式的计算公式
2017/03/18 PHP
JS类中定义原型方法的两种实现的区别
2007/03/08 Javascript
Javascript处理DOM元素事件实现代码
2012/05/23 Javascript
九种js弹出对话框的方法总结
2013/03/12 Javascript
网页前端优化之滚动延时加载图片示例
2013/07/13 Javascript
JavaScript对HTML DOM使用EventListener进行操作
2015/10/21 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
2016/06/17 Javascript
浅析BootStrap Treeview的简单使用
2016/10/12 Javascript
javascript实现鼠标点击页面 移动DIV
2016/12/02 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
2019/10/25 Javascript
微信小程序pinker组件使用实现自动相减日期
2020/05/07 Javascript
python获取元素在数组中索引号的方法
2015/07/15 Python
django基础之数据库操作方法(详解)
2017/05/24 Python
python字典快速保存于读取的方法
2018/03/23 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
2018/04/19 Python
Python3.6通过自带的urllib通过get或post方法请求url的实例
2018/05/10 Python
Django中的ajax请求
2018/10/19 Python
对python中if语句的真假判断实例详解
2019/02/18 Python
Python3日期与时间戳转换的几种方法详解
2019/06/04 Python
对python 中class与变量的使用方法详解
2019/06/26 Python
Django之编辑时根据条件跳转回原页面的方法
2019/08/21 Python
如何解决django-celery启动后迅速关闭
2019/10/16 Python
python 变量初始化空列表的例子
2019/11/28 Python
python + selenium 刷B站播放量的实例代码
2020/06/12 Python
python基于selenium爬取斗鱼弹幕
2021/02/20 Python
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
英国时尚泳装品牌:Maru Swimwear
2019/10/06 全球购物
全球领先的在线cosplay服装商店:RoleCosplay
2020/01/18 全球购物
安全责任协议书
2014/04/21 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
观后感的写法
2015/06/19 职场文书
js 数组 fill() 填充方法
2021/11/02 Javascript