网站地图    收藏   

主页 > php专栏 > php应用 >

启用sphinx全文搜索与实例 - php高级应用

来源:自学PHP网    时间:2014-11-27 22:16 作者: 阅读:

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

启用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 配置文件:

  1. source tmsgs    
  2. {    
  3.         type                                    = mysql    
  4.         sql_host                                = localhost    
  5.         sql_user                                = root    
  6.         sql_pass                                = 1    
  7.         sql_db                                  = phpwind75sp3    
  8.         sql_port                                = 3306  # optional, default is 3306    
  9.         #sql_sock                                = /tmp/mysql3307.sock    
  10.         sql_query_pre                           = SET NAMES gbk    
  11.         sql_query                               = SELECT id,name,type,stock FROM pw_tools    
  12.         #sql_attr_uint                          = id    
  13.         sql_attr_uint                           = stock    
  14. }    
  15.    
  16. index tmsgsindex    
  17. {    
  18.         source                                  = tmsgs    
  19.         path                                    = /var/mmseg/searchdata/beihai365    
  20.         docinfo                                 = extern    
  21.         charset_type                            = zh_cn.gbk    
  22.         #min_prefix_len  = 0    
  23.         #min_infix_len  = 2    
  24.         #ngram_len = 2    
  25.         charset_dictpath                        = /var/mmseg/data    
  26.         #min_prefix_len                          = 0    
  27.         #min_infix_len                           = 0    
  28.         #min_word_len                            = 2    
  29. }    
  30.    
  31. indexer    
  32. {    
  33.         mem_limit                               = 128M    
  34. }    
  35.    
  36. searchd    
  37. {    
  38.         #listen                                = 3312    
  39.         log                                 = /var/log/searchd.log    
  40.         query_log                           = /var/log/query.log    
  41.         read_timeout                        = 5    
  42.         max_children                        = 30    
  43.         pid_file                            = /var/log/searchd.pid    
  44.         max_matches                         = 1000    
  45.         #seamless_rotate                     = 1    
  46.         #preopen_indexes                     = 0    
  47.         #unlink_old                          = 1    
  48. }   
  49. source tmsgs 
  50.         type                                    = mysql 
  51.         sql_host                                = localhost 
  52.         sql_user                                = root 
  53.         sql_pass                                = 1 
  54.         sql_db                                  = phpwind75sp3 
  55.         sql_port                                = 3306  # optional, default is 3306 
  56.         #sql_sock                                = /tmp/mysql3307.sock 
  57.         sql_query_pre                           = SET NAMES gbk 
  58.         sql_query                               = SELECT id,name,type,stock FROM pw_tools 
  59.         #sql_attr_uint                          = id 
  60.         sql_attr_uint                           = stock 
  61. index tmsgsindex 
  62.         source                                  = tmsgs 
  63.         path                                    = /var/mmseg/searchdata/beihai365 
  64.         docinfo                                 = extern 
  65.         charset_type                            = zh_cn.gbk 
  66.         #min_prefix_len  = 0 
  67.         #min_infix_len  = 2 
  68.         #ngram_len = 2 
  69.         charset_dictpath                        = /var/mmseg/data 
  70.         #min_prefix_len                          = 0 
  71.         #min_infix_len                           = 0 
  72.         #min_word_len                            = 2 
  73. indexer 
  74.         mem_limit                               = 128M 
  75. searchd 
  76.         #listen                                = 3312 
  77.         log                                 = /var/log/searchd.log 
  78.         query_log                           = /var/log/query.log 
  79.         read_timeout                        = 5 
  80.         max_children                        = 30 
  81.         pid_file                            = /var/log/searchd.pid 
  82.         max_matches                         = 1000 
  83.         #seamless_rotate                     = 1 
  84.         #preopen_indexes                     = 0 
  85.         #unlink_old                          = 1 

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

  1. <?php    
  2.     header("Content-type:text/html;charset=utf-8");    
  3.     include 'sphinxapi.php';    
  4.     $cl = new SphinxClient();    
  5.     $cl->SetServer('localhost',3312);    
  6.     $cl->SetMatchMode(SPH_MATCH_ALL);    
  7.     $cl->SetArrayResult(true);    
  8.     $res = $cl->Query("名卡","*");    
  9.     print_r($res);    
  10.         
  11. ?>   
  12. <?php 
  13. header("Content-type:text/html;charset=utf-8"); 
  14. include 'sphinxapi.php'
  15. $cl = new SphinxClient(); 
  16. $cl->SetServer('localhost',3312); 
  17. $cl->SetMatchMode(SPH_MATCH_ALL); 
  18. $cl->SetArrayResult(true); 
  19. $res = $cl->Query("名卡","*"); 
  20. print_r($res); 
  21. //开源代码phpfensi.com 
  22. ?>  

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

  1. Array    
  2. (    
  3.     [error] =>     
  4.     [warning] =>     
  5.     [status] => 0    
  6.     [fields] => Array    
  7.         (    
  8.             [0] => name    
  9.             [1] => type    
  10.         )    
  11.    
  12.     [attrs] => Array    
  13.         (    
  14.             [stock] => 1    
  15.         )    
  16.    
  17.     [matches] => Array    
  18.         (    
  19.             [0] => Array    
  20.                 (    
  21.                     [id] => 8    
  22.                     [weight] => 1    
  23.                     [attrs] => Array    
  24.                         (    
  25.                             [stock] => 100    
  26.                         )    
  27.    
  28.                 )    
  29.    
  30.         )    
  31.    
  32.     [total] => 1    
  33.     [total_found] => 1    
  34.     [time] => 0.018    
  35.     [words] => Array    
  36.         (    
  37.             [名卡] => Array    
  38.                 (    
  39.                     [docs] => 1    
  40.                     [hits] => 1    
  41.                 )    
  42.    
  43.         )    
  44.    
  45. )   
  46. Array 
  47.     [error] =>  
  48.     [warning] =>  
  49.     [status] => 0 
  50.     [fields] => Array 
  51.         ( 
  52.             [0] => name 
  53.             [1] => type 
  54.         ) 
  55.     [attrs] => Array 
  56.         ( 
  57.             [stock] => 1 
  58.         ) 
  59.     [matches] => Array 
  60.         ( 
  61.             [0] => Array 
  62.                 ( 
  63.                     [id] => 8 
  64.                     [weight] => 1 
  65.                     [attrs] => Array 
  66.                         ( 
  67.                             [stock] => 100 
  68.                         ) 
  69.                 ) 
  70.         ) 
  71.     [total] => 1 
  72.     [total_found] => 1 
  73.     [time] => 0.018 
  74.     [words] => Array 
  75.         ( 
  76.             [名卡] => Array 
  77.                 ( 
  78.                     [docs] => 1 
  79.                     [hits] => 1 
  80.                 ) 
  81.         ) 

完全没问题,搜索出来了,几个关键的操作:

[root@beihai365 /]# csft-searchd --stop 停止搜索守护

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

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

  1. Coreseek Full Text Server 3.1 
  2. Copyright (c) 2006-2008 coreseek.com 
  3. using config file './csft.conf'... 
  4. 1, 
  5. pt:1, 1;        index 'tmsgsindex': query 'App ': returned 0 matches of 0 total in 0.017 sec 
  6. words: 
  7. 1. 'app': 0 documents, 0 hits 

当大家在运行这些命令的时候发现,需要你自己手动的置顶 --config  sphinx.conf   配置文件的路径,很不方便,所以我干脆 ln -s 一个在 ./,这样不用每次都去敲入  --config.

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论