如何使用Sphinx来实现全文检索(搜索)功能

前年(2009)在参与开发CMSTOP系统时,就知道此CMS使用Sphinx实现进行全文检索功能。但那时候自己并没有这功能的开发。不过了解了Sphinx的全文搜索的强大功能。这次,在新的公司,也要做一个全文搜索功能。第一时间就想到了Sphinx来进行功能的实现。

当然在实际上,Sphinx对中文的分词功能并不好。可是很庆幸地是,Coreseek很好地帮我们解决了这一个问题。在这里很感谢此团队为开源事业做出的贡献。Sphinx能得到很多人的认同与用使用,很大一部分功劳和这团队关系。关于此团队更多信息可查看Coreseek首页。

下面我就基本地简介一下如何使用Sphinx来实现全文检索功能,当然大部分安装信息都是在Coreseek主站上直接copy下来,因为他们写的实在太详细了。让我没有任何可发挥的地方。

1.下载Sphinx 支持中文分词Coreseek  http://www.coreseek.cn/news/11/52/

2.进行安装:参考http://www.coreseek.cn/products-install/install_on_bsd_linux/
##下载coreseek:coreseek 3.2.14:点击下载、coreseek 4.0.1:点击下载

$ wget http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz
$ 或者 http://www.coreseek.cn/uploads/csft/4.0/coreseek-4.0.1-beta.tar.gz
$ tar xzvf coreseek-3.2.14.tar.gz 或者 coreseek-4.0.1-beta.tar.gz
$ cd coreseek-3.2.14 或者 coreseek-4.0.1-beta

##安装mmseg

$ cd mmseg-3.2.14
$ ./bootstrap    #提示中如无error可以不用理会
$ ./configure --prefix=/usr/local/mmseg3
$ make && make install
$ cd ..

##安装coreseek,需提前安装mysql依赖库及操作系统基础开发库以支持mysql数据源和xml数据源

$ cd csft-3.2.14 或者 cd csft-4.0.1
$ sh buildconf.sh    #提示中如无error可以不用理会
$ ./configure --prefix=/usr/local/coreseek  --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/
--with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql    ##如果提示mysql问题,可以查看MySQL数据源安装说明
$ make && make install
$ cd ..

##测试mmseg分词,coreseek搜索(需要预先设置好字符集为zh_CN.UTF-8,确保正确显示中文)

$ cd testpack
$ cat var/test/test.xml    #此时应该正确显示中文
$ /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml
$ /usr/local/coreseek/bin/indexer -c etc/csft.conf --all

 

3.增加Sphinx增量索引

a.先建立一个计数表

CREATE TABLE sph_counter(
  		counter_id INTEGER PRIMARY KEY NOT NULL,
  		max_doc_id INTEGER NOT NULL
     );

b.修改sphinx.conf

#主要数据源
      source main
	{
    	type                    = mysql

    	sql_host                = localhost
    	sql_user                = oophp
    	sql_pass                = oophp.cn
    	sql_db                    = oophp
    	sql_port                = 3306
    	sql_query_pre            = SET NAMES utf8
    	sql_query_pre	    =REPLACE INTO sph_counter SELECT 1, MAX(id) FROM dede_archives
    	sql_query                = Select  *  From article where channel=3 AND id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
                                                              	#sql_query第一列id需为整数
                                                              	#title、content作为字符串/文本字段,被全文索引
    	#sql_attr_uint            =id           #从SQL读取到的值必须为整数
    	#sql_attr_timestamp        =pubdata_attr #从SQL读取到的值必须为整数,作为时间属性

    	sql_query_info_pre      = SET NAMES utf8                                        #命令行查询时,设置正确的字符集
    	sql_query_info = Select * From article WHERE channel=3  AND id=$id
	}

       #增量数据源
	source delta : main
	{
		sql_query_pre =SET NAMES utf8
        	sql_query = Select * From article  where  channel=3 AND \
	id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
	}

	#主索引生成
	index main
	{
    	source            = main             #对应的source名称
    	path            = /usr/local/coreseek/data/main/ #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    	docinfo            = extern
    	mlock            = 0
    	morphology        = none
    	min_word_len        = 1
    	html_strip                = 0
    	ngram_len=0
    	#中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
    	charset_dictpath = /usr/local/mmseg3/etc/   #BSD、Linux环境下设置,/符号结尾
    	#charset_dictpath = etc/                             #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
    	charset_type        = zh_cn.utf-8
    	#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

	}

       #增量索引
	index delta : main
	{
    		source            = delta             #对应的source名称
    		path            = /usr/local/coreseek/data/delta/ #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
	}
	#全局index定义
	indexer
	{
    		mem_limit            = 128M
	}

	#searchd服务定义
	searchd
	{
    		listen                  =   9312
    		read_timeout        = 5
    		max_children        = 30
    		max_matches            = 1000
    		seamless_rotate        = 0
    		preopen_indexes        = 0
    		unlink_old            = 1
    		pid_file = /var/log/searchd.pid  #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    		log = /var/log/searchd_mysql.log        #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    		query_log = /var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    		binlog_path =                                #关闭binlog日志
	}

 

c.启动sphinx服务,并生成主索引

#/usr/local/coreseek/bin/searchd
 # /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf main --rotate

d.建立生成主索引和增量索引shell脚本

build_main_index.sh脚本:
		#!/bin/sh
		#/usr/local/coreseek/bin/searchd --stop
		/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf main --rotate 

build_delta_index.sh脚本:
		#!/bin/sh
		#/usr/local/coreseek/bin/searchd --stop
		/usr/local/coreseek/bin/indexer  -c /usr/local/coreseek/etc/sphinx.conf  delta --rotate
		/usr/local/coreseek/bin/indexer  -c /usr/local/coreseek/etc/sphinx.conf --merge main delta --merge-dst-range deleted 0 0 --rotate
		#/usr/local/coreseek/bin/searchd

e.写入cron计划任务中,生成增量索引,并重新建立主索引

//每10分钟生成一次索引
*/10 * * * *  /bin/sh /usr/local/coreseek/build_delta_index.sh >/dev/null 2>&1  

//每天凌晨3点过5分,重新建立一次主索引
5 3 * * *  /bin/sh /usr/local/coreseek/build_main_index.sh > /dev/null 2>&1

参考网站:

http://sphinxsearch.com/

http://www.coreseek.cn/

http://www.sphinxsearch.org/archives/category/sphinx

http://blog.c1gstudio.com/archives/730