您的位置:首页 > 其它

Sphinx 安装配置使用

2013-11-05 11:27 295 查看
一、Sphinx是什么?
Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎。意图为其他应用提供高速、低空间占用、高结果 相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和脚本语言集成。当前系统内置MySQL和PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式 的XML数据。通过修改源代码,用户可以自行增加新的数据源

二、安装
1、下载所需的安装包
# wget https://sphinx-for-chinese.googlecode.com/files/sphinx-for-chinese-2.1.0-dev-r3361.tar.bz2
2、安装 sphinx
# cd sphinx-for-chinese-2.1.0-dev-r3361
# ./configure --prefix=/usr/local/sphinx
# make
# sudo make install
如果显示bin,etc和var三个目录表示安装成功
3、创建test数据库,并创建sphinx用户(可忽略)
mysql> create database test;
mysql>create user 'sphinx'@'localhost' identified by 'sphinx';
mysql>grant all privileges on test.* to 'sphinx'@'localhost';

4、指定sphinx配置文件
# cd /usr/local/sphinx/etc
# sudo cp sphinx.conf.dist sphinx.conf
5、编辑配置文件

sql_host = localhost
sql_user = sphinx
sql_pass = sphinx
sql_db = test
sql_port = 3306 # optional, default is 3306

到这里为止,sphinx已经可以使用了,但还不能支持中文切词,以下是加入中文切词的步骤

三、配置中文词库:
1、去官网下载并解压字典文件 xdict_1.1.tar.gz

2、将解压好的 xdict.txt 拷贝到 /usr/local/sphinx/bin 下并生成字典
# sudo /usr/local/sphinx/bin/mkdict xdict.txt xdict
3、将生成的字典 xdict 拷贝到 /usr/local/sphinx/etc目录下
# sudo cp -p xdict ../etc/
4、配置中文切词 打开 sphinx.conf文件,找到 'charset_type = sbcs' 字样,将其改为:
# charset_type = utf-8 #字符集编码
# chinese_dictionary = /usr/local/sphinx/etc/xdict #指定分词库 sphinx-for-chines特有的选项

四、实现一个分布式索引的搜索服务:
A、searchd多处理模式(MPM)有:
# none: 所有请求都将被串行处理
# fork: 创建一个新的子进程来处理每个传入请求
# prefork: searchd会在启动时,预先fork一个工作进程数,再将传入的请求传递给子进程处理
# threads: 将创建一个新的线程来处理每个传入请求
B、以一个论坛为例(论坛的帖子表被分割为post、post_1、post_2),当搜索时由bbs.conf接受搜索关键词,并将接受的关键词转发给三个子进程(bbs_9310.conf、bbs_9311.conf、bbs_9312.conf)的搜索服务上;
1、bbs.conf配置如下:
index bbs_thread_distributed {
# 索引类型。可用的值包括plain(普通本地索引)、distributed(分布式)或rt(实时索引)。可选选项,默认值为plain(索引为普通本地索引)
type = distributed
# 声明搜索分布式索引时要搜索的远程代理
agent = 127.0.0.1:9310:bbs_main_0
agent = 127.0.0.1:9311:bbs_main_1
agent = 127.0.0.1:9312:bbs_main_2

# 设置文档的字符集
charset_type = utf-8
# 远程代理的连接超时时间,单位为毫秒。可选选项,默认为1000(即1秒)
agent_connect_timeout = 1000
# 远程代理查询超时时间,以毫秒为单位。可选选项,默认为3000
agent_query_timeout = 3000
}

searchd {
listen = 127.0.0.1:9300
# 搜索系统日志
log= /home/logs/sphinx/9300.searchd.log
# 搜索查询日志
query_log = /home/logs/sphinx/9300.query.log
# 子进程的最大数量(或者说,并行执行的搜索的数目)。可选项,默认为0,不限制
max_children = 30
# PID文件会在启动时重建, 必选项
pid_file = /home/sphinx/9300.searchd.pid
# 最大返回匹配数
max_matches = 10000
# 防止 searchd 轮换在需要预取大量数据的索引时停止响应。可选选项,默认为1(启用无缝(seamless)轮换)
seamless_rotate = 1
# 索引轮换成功之后,是否删除以.old为扩展名的索引拷贝。可选选项,默认为1
unlink_old = 1
。。。。。。
# 多处理模式(MPM)。 可选项;可用值为none、fork、prefork,以及threads。 默认在Unix类系统为form,Windows系统为threads
workers = prefork # for RT to work
}

2、各子进程配置如下(bbs_9310.conf为例):
#主索引源
source bbs_main_0 {
type = mysql # 数据库类型
sql_host = 127.0.0.1
sql_user = spinx
sql_pass = 123456
sql_db = discuz_x2
sql_port = 3306
sql_query_pre = SET NAMES utf8
}
source main : bbs_main_0 {
sql_query = SELECT p.tid as id, p.tid, p.pid, p.subject, p.message, p.dateline, p.attachment, t.views, t.replies FROM pre_forum_post p left join pre_forum_thread t on p.tid=t.tid where p.`first`=1 and p.`invisible`=0
#返回值
sql_attr_uint = tid
sql_attr_string = subject
sql_attr_uint = replies
sql_attr_uint = views
sql_attr_timestamp = dateline
}

index bbs_main_0 {
source= main # 向本地索引增加文档源, 可以出现多次,必须选项
path = /home/sphinx/data/bbs_post/bbs_main_0
min_word_len = 2 # 最小索引词长度,可选选项,默认为1(索引任何词)
charset_type = utf-8 #字符集编码
chinese_dictionary = /usr/local/sphinx-for-chinese/var/xdict #指定分词库 sphinx-for-chines特有的选项
html_strip = 1 # 是否从输入全文数据中去除HTML标记。可选标记,默认为0。已知值包括0(禁用)和1(启用)
.........
}

indexer {
mem_limit = 256M
}

searchd {
# 指定searchd监听的IP地址和端口
listen = 127.0.0.1:9310
# 搜索系统日志
log= /home/logs/sphinx/9310.searchd.log
# 搜索查询日志
query_log = /home/logs/sphinx/9310.query.log
# PID文件会在启动时重建, 必选项
pid_file = /home/sphinx/9310.searchd.pid

.......

workers = threads
}
(备注:以上配置项中部分默认配置省略掉,可参考文档配置)

五、其它:
1、关于sphinx的返回值的问题?
用sphinx服务提供api的时候,在返回值的问题上正统的做法是,根据搜索的比如帖子的tid、pid再拿着这些去再做一次查询获取想要的返回参数封装成返回值,如果是一个不需要提供高效的实时索引的服务的时候感觉这种做法会影响api的性能,如果在searchd的时候就能返回需要返回的参数不就省去了一次连接查询。但是如果用这种冗余数据的方法来做,如果用户对帖子标题做了修改这时数据不一致也麻烦~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: