Sphinx 配置及使用
作者 斯人 | 发布于 2013 年 2 月 20 日
Sphinx

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

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

表名 wp_posts,字段描述如下


重点在于 Sphinx.conf的配置

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

group,order by 中用到。

#源名称
source wordpress_s
{
        type                    = mysql

        sql_host                = localhost
        sql_user                = test
        sql_pass                = 111
        sql_db                  = wordpress
        sql_port                = 3306  # optional, default is 3306
        sql_query_pre           = SET NAMES UTF8 # 执行sql前要设置的字符集,(SET NAMES UTF8)
        #全文检索要显示的内容 , 据官方说法 : 尽可能不要使用 WHERE 或 GROUPBY , 将其交给 SPHINX 效率会更高 ;select 出来的字段必须包含至少一个唯一主键 , 以及全文检索的字段
        #SELECT 的字段必须至少包含一个唯一主键,而且这个唯一主键如果不是id,则需要 as 为id,以及全文检索的字段,在where用到的字段也要SELECT出来
#这里我对ID,post_title,post_content,post_name,post_author进行索引
        sql_query               =  SELECT ID as id,post_title,post_content,post_name,post_author from wp_posts

        #sql_attr* 标示属性字段,你计划要在where ,orderby group中用的字段要在这里定义 ,可以在搜索的时候用于过滤和排序。#sql_attr_uint,sql_attr_string,sql_attr_timestamp等,关于属性详见http://www.coreseek.cn/docs/coreseek_4.1-sphinx_2.0.1-beta.html#attributes
        
        sql_attr_uint           = ID
        sql_field_string        =post_title
        sql_field_string        =post_name
        #sql_attr_timestamp     = date_added
//sql_query_info          文档信息查询。 可选选项,默认为空。 仅对 mysql 数据源有效。

仅被命令行搜索所用,用来获取和显示文档信息,目前仅对MySQL有效,且仅用于调试目的。此查询为每个文档ID获取CLI搜索工具要显示的文档信息。 它需要包含$id宏,以此来对应到查询的文档的ID。
        sql_query_info          = SELECT * FROM wp_posts WHERE id=$id # $id 好像不能是其他的。

        #strip_html=0 #是否去掉HTML标签 新版本好像已经不再支持这个设置,它要在index索引中用html_strip代替。
}
#索引名称
#index name
index wordpress_i
{
        source                  = wordpress_s #源名称 
        path                    = /home/admin/sphinx/var/data/wordperss #生成索引的目录
        docinfo                 = extern
        min_prefix_len          = 0 #分词最小前缀
        min_infix_len           = 1 #分词最小中缀
        min_word_len            = 1     #索引的词的最小长度 设为 1 既可以搜索单个字节搜索 , 越小 索引越精确 , 但建立索引花费的时间越长
        charset_type            = utf-8 #设置数据编码为UTF8
        charset_table           = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
        ngram_chars             = U+3000..U+2FA1F
        ngram_len               =1 #对于非字母型数据的长度切
        html_strip              =1 #去掉HTML标签
}
indexer
{
        mem_limit               = 32M
}
searchd
{
        listen                  = 9312
        listen                  = 9306:mysql41
        log                     = /home/admin/sphinx/var/log/searchd.log
        query_log               = /home/admin/sphinx/var/log/query.log
        read_timeout            = 5
        max_children            = 30
        pid_file                = /home/admin/sphinx/var/log/searchd.pid
        max_matches             = 1000
        seamless_rotate         = 1
        preopen_indexes         = 1
        unlink_old              = 1
        workers                 = threads # for RT to work
        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 #字符串(很明显!),但前者仅用于检索,而后者可作为全文本被索引。

其结构组成主要如下 :

Source 源名称 1{                // 指定数据源
       一些配置
}
Index 索引名称 1{
       Source= 源名称 1
}
Source 源名称 2{
       一些配置
}
Index 索引名称 2{
        Source= 源名称 2
}
Indexer{
        mem_limit = 32M         //索引过程中内存使用的限制
}
Searchd{                             // 配置 searchd 守护程序本身
}

Source配置项如下:

#type 数据库类型,目前支持mysql与pgsql 


#sql_host 数据库主机地址 

#sql_user 数据库用户名 

#sql_pass 数据库密码 

#sql_db 数据库名称 

#sql_port 数据库采用的端口 

#sql_query_pre 执行sql前要设置的字符集,用utf8必须SET NAMES utf8 

#sql_query 全文检索要显示的内容,在这里尽可能不使用where或group by,将where与 

groupby的内容交给sphinx,由sphinx进行条件过滤与groupby效率会更高 

#注意:select 出来的字段必须至少包括一个唯一主键(ARTICLESID)以及要全文检索的 

字段,你计划原本在where中要用到的字段也要select出来 

#这里不用使用orderby 

#sql_attr_开头的表示一些属性字段,你原计划要用在where,orderby,groupby中的字段要 

在这里定义 

index 索引部分如下

        source                  = wordpress_s #源名称 

        path                    = /home/admin/sphinx/var/data/wordperss #生成索引的目录

        docinfo                 = extern

        charset_type            = utf-8 #字符集编码

        charset_table           = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F#表示可被一元字符切分模式认可的有效字符集

        ngram_chars             = U+3000..U+2FA1F #表示要进行一元字符切分模式的字符集

        ngram_len               =1#表示使用一元字符切分模式,从而得以对单个中文字符进行索引;

        html_strip              =1 #过滤HTML标签

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

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

怎么来进行搜索呢?

首先启动search服务

>bin/searchd

相应的停止命令是

>bin/searchd –stop

进行搜索喽

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

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

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

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

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

在PHP中的是用方法,

require ( "sphinxapi.php" );

$q=$argv[1];

$cl=new SphinxClient();              
$cl->SetServer('localhost',9312);  
$cl->SetArrayResult(true);          
$cl->SetLimits(0,10);                
$result=$cl->Query($q);
print_r($result);

运行

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

查看结果,

但是好像有个问题,

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

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