上一篇讲了Sphinx的安装,这篇来说说怎么用吧。

我以我博客文章为例,我想对我博客的内容进行全文检索

表名 wp_posts,字段描述如下

重点在于 Sphinx.conf的配置

索引生成和搜索都是以这个文件为依据,要进行全文检索就得先把它配置好,让Sphinx知道哪些字段需要索引,哪些字段在where ,

group,order by 中用到。

 

  1. #源名称 
  2. source wordpress_s 
  3.         type                    = mysql 
  4.   
  5.         sql_host                = localhost 
  6.         sql_user                = test 
  7.         sql_pass                = 111 
  8.         sql_db                  = wordpress 
  9.         sql_port                = 3306  # optional, default is 3306 
  10.         sql_query_pre           = SET NAMES UTF8 # 执行sql前要设置的字符集,(SET NAMES UTF8) 
  11.         #全文检索要显示的内容 , 据官方说法 : 尽可能不要使用 WHERE 或 GROUPBY , 将其交给 SPHINX 效率会更高 ;select 出来的字段必须包含至少一个唯一主键 , 以及全文检索的字段 
  12.         #SELECT 的字段必须至少包含一个唯一主键,而且这个唯一主键如果不是id,则需要 as 为id,以及全文检索的字段,在where用到的字段也要SELECT出来 
  13. #这里我对ID,post_title,post_content,post_name,post_author进行索引 
  14.         sql_query               =  SELECT ID as id,post_title,post_content,post_name,post_author from wp_posts 
  15.   
  16.         #sql_attr* 标示属性字段,你计划要在where ,orderby group中用的字段要在这里定义 
  17.         sql_attr_uint           = ID 
  18.         sql_field_string        =post_title 
  19.         sql_field_string        =post_name 
  20.         #sql_attr_timestamp     = date_added 
  21.   
  22.         sql_query_info          = SELECT * FROM wp_posts WHERE id=$id # $id 好像不能是其他的。 
  23.   
  24.         #strip_html=0 #是否去掉HTML标签 新版本好像已经不再支持这个设置,它要在index索引中用html_strip代替。 
  25. #索引名称 
  26. #index name 
  27. index wordpress_i 
  28.         source                  = wordpress_s #源名称 
  29.         path                    = /home/admin/sphinx/var/data/wordperss #生成索引的目录 
  30.         docinfo                 = extern 
  31.         min_prefix_len          = 0 #分词最小前缀 
  32.         min_infix_len           = 1 #分词最小中缀 
  33.         min_word_len            = 1     #索引的词的最小长度 设为 1 既可以搜索单个字节搜索 , 越小 索引越精确 , 但建立索引花费的时间越长 
  34.         charset_type            = utf-8 #设置数据编码为UTF8 
  35.         charset_table           = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F 
  36.         ngram_chars             = U+3000..U+2FA1F 
  37.         ngram_len               =1 #对于非字母型数据的长度切 
  38.         html_strip              =1 #去掉HTML标签 
  39. indexer 
  40.         mem_limit               = 32M 
  41. searchd 
  42.         listen                  = 9312 
  43.         listen                  = 9306:mysql41 
  44.         log                     = /home/admin/sphinx/var/log/searchd.log 
  45.         query_log               = /home/admin/sphinx/var/log/query.log 
  46.         read_timeout            = 5 
  47.         max_children            = 30 
  48.         pid_file                = /home/admin/sphinx/var/log/searchd.pid 
  49.         max_matches             = 1000 
  50.         seamless_rotate         = 1 
  51.         preopen_indexes         = 1 
  52.         unlink_old              = 1 
  53.         workers                 = threads # for RT to work 
  54.         binlog_path             = /home/admin/sphinx/var/data 

Sphinx支持几个属性类型

sql_attr_uint 和 sql_attr_bigint

 

# 32 位无符号整数值和 64 位有符号整数值。可对所有整数数据库字段和 DATE 使用这两种类型。

sql_attr_float #32 位浮点值。如果您想要存储地理坐标,可使用此属性类型。还要注意的是,如果您需要更高的精确度,则没有解决

方法;字段四舍五入到七位小数。

sql_attr_bool #一个布尔型(单个位)值,类似于 MySQL 的 tinyint 值。

sql_attr_timestamp #一种 UNIX 时间戳,可表示从 1970-01-01 到 2038-01-19 的日期/时间值。您在 Sphinx 中无法直

接使用 DATE 或 DATETIME 列类型。您必须使用 UNIX_TIMESTAMP() 函数将它们转换为时间戳。如果您仅需要日期,可使用

TO_DAYS() 函数将 DATE 字段转换为一个整数。

sql_attr_string 和 sql_field_string #字符串(很明显!),但前者仅用于检索,而后者可作为全文本被索引。

其结构组成主要如下 :

 

  1. Source 源名称 1{                // 指定数据源 
  2.        一些配置 
  3. Index 索引名称 1{ 
  4.        Source= 源名称 1 
  5. Source 源名称 2{ 
  6.        一些配置 
  7. Index 索引名称 2{ 
  8.         Source= 源名称 2 
  9. Indexer{ 
  10.         mem_limit = 32M         //索引过程中内存使用的限制 
  11. Searchd{                             // 配置 searchd 守护程序本身 

 

Source配置项如下:

 

 

 

  1. #type 数据库类型,目前支持mysql与pgsql  
  2.   
  3. #sql_host 数据库主机地址  
  4.   
  5. #sql_user 数据库用户名  
  6.   
  7. #sql_pass 数据库密码  
  8.   
  9. #sql_db 数据库名称  
  10.   
  11. #sql_port 数据库采用的端口  
  12.   
  13. #sql_query_pre 执行sql前要设置的字符集,用utf8必须SET NAMES utf8  
  14.   
  15. #sql_query 全文检索要显示的内容,在这里尽可能不使用where或group by,将where与  
  16.   
  17. groupby的内容交给sphinx,由sphinx进行条件过滤与groupby效率会更高  
  18.   
  19. #注意:select 出来的字段必须至少包括一个唯一主键(ARTICLESID)以及要全文检索的  
  20.   
  21. 字段,你计划原本在where中要用到的字段也要select出来  
  22.   
  23. #这里不用使用orderby  
  24.  
  25.   
  26. #sql_attr_开头的表示一些属性字段,你原计划要用在where,orderby,groupby中的字段要  
  27.   
  28. 在这里定义 
  29.  

 index 索引部分如下

 

  1. source                  = wordpress_s #源名称  
  2.   
  3. path                    = /home/admin/sphinx/var/data/wordperss #生成索引的目录 
  4.   
  5. docinfo                 = extern 
  6.   
  7. charset_type            = utf-8 #字符集编码 
  8.   
  9. charset_table           = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F#表示可被一元字符切分模式认可的有效字符集 
  10.   
  11. ngram_chars             = U+3000..U+2FA1F #表示要进行一元字符切分模式的字符集 
  12.   
  13. ngram_len               =1#表示使用一元字符切分模式,从而得以对单个中文字符进行索引; 
  14.   
  15. html_strip              =1 #过滤HTML标签 

配置好了以后,就可以用bin/indexer来生成索引了,下面介绍一下经常用到的几个命令。

 

  1. #更新全部索引 如果不指定-c则会默认加载sphinx.conf配置 
  2. >bin/indexer -c(--config)  /home/amdin/sphinx/etc/sphinx.conf --all 
  3.  #更新索引wordpress_i 
  4. >bin/indexer -c /home/amdin/sphinx/etc/sphinx.conf 【索引名】 
  5. #用于轮换索引,他将建立一个额外的索引,一旦建立完成,它将给searchd 发送一个信号,searchd将把原有的索引重命名*.old,将这个额外索引加载进来 
  6. >bin/indexer --config /home/myuser/sphinx.conf --all 
  7. #合并增量索引到主索引 
  8. >bin/indexer --merge main addtion_index --rotate 

怎么来进行搜索呢?

首先启动search服务

>bin/searchd

相应的停止命令是

>bin/searchd –stop

进行搜索喽

> bin/search -c etc/sphinx.conf ‘斯人’

全文搜索斯人这个词,因为我的最小分割数是1,所以斯人会拆分为“斯”,“人”两个字进行搜索,这样虽然搜索效果最佳,但是建立索引的时间更长。

运行成功后会显示一大堆信息 ,如图

标红是比较中重要的信息:是用的索引,搜索词,匹配结果数,搜索时间等信息,

document 意思是在这一条数据中命中了几次。

在PHP中的是用方法,

 

  1. require ( "sphinxapi.php" ); 
  2.   
  3. $q=$argv[1]; 
  4.   
  5. $cl=new SphinxClient(); 
  6. $cl->SetServer('localhost',9312); 
  7. $cl->SetArrayResult(true); 
  8. $cl->SetLimits(0,10); 
  9. $result=$cl->Query($q); 
  10. print_r($result); 

运行

>/home/admin/fpm-php/bin/php test.php ‘斯人’

查看结果,

但是好像有个问题,

不知道为什么没有显示出文本内容来,只有一些基本信息,难不成让我拿到id号再去MYSQL取详细数据不成??

原文出处:http://www.imsiren.com/archives/766