首页 > 运营 > 建站经验 > 正文

php启用sphinx全文搜索的实现方法

2021-11-23 22:57:26
字体:
来源:转载
供稿:网友

这篇文章主要介绍了php启用sphinx全文搜索的实现方法,详细讲述了sphinx相关的配置与使用技巧,具有一定的参考借鉴价值,需要的朋友可以参考下

本文实例讲述了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 配置文件:

  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. <?php 
  12. header("Content-type:text/html;charset=utf-8"); 
  13. include 'sphinxapi.php'
  14. $cl = new SphinxClient(); 
  15. $cl->SetServer('localhost',3312); 
  16. $cl->SetMatchMode(SPH_MATCH_ALL); 
  17. $cl->SetArrayResult(true); 
  18. $res = $cl->Query("名卡","*"); 
  19. print_r($res); 
  20. ?> 

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

  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.     [total] => 1    
  30.     [total_found] => 1    
  31.     [time] => 0.018    
  32.     [words] => Array    
  33.         (    
  34.             [名卡] => Array    
  35.                 (    
  36.                     [docs] => 1    
  37.                     [hits] => 1    
  38.                 )    
  39.         )    
  40. )   
  41. Array 
  42.     [error] =>  
  43.     [warning] =>  
  44.     [status] => 0 
  45.     [fields] => Array 
  46.         ( 
  47.             [0] => name 
  48.             [1] => type 
  49.         ) 
  50.     [attrs] => Array 
  51.         ( 
  52.             [stock] => 1 
  53.         ) 
  54.     [matches] => Array 
  55.         ( 
  56.             [0] => Array 
  57.                 ( 
  58.                     [id] => 8 
  59.                     [weight] => 1 
  60.                     [attrs] => Array 
  61.                         ( 
  62.                             [stock] => 100 
  63.                         ) 
  64.                 ) 
  65.         ) 
  66.     [total] => 1 
  67.     [total_found] => 1 
  68.     [time] => 0.018 
  69.     [words] => Array 
  70.         ( 
  71.             [名卡] => Array 
  72.                 ( 
  73.                     [docs] => 1 
  74.                     [hits] => 1 
  75.                 ) 
  76.         ) 

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

[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.  
  3. Copyright (c) 2006-2008 coreseek.com 
  4. using config file './csft.conf'... 
  5. 1, 
  6. pt:1, 1;        index 'tmsgsindex': query 'App ': returned 0 matches of 0 total in 0.017 sec 
  7. words: 
  8. 1. 'app': 0 documents, 0 hits 

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

希望本文所述对大家的php程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表