这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议这两个中选择一个,暂时不要选择原版Sphinx(对中文的支持不是很好).又因为服务器所用MySQL在当时编译时并没有编译Sphinx扩展,而重新编译MySQL并加入Sphinx暂时又无法实现(项目用到了多台服务器,在不影响现有业务的情况下不可能去重新编译MySQL的),所以采用的是程序通过API来外部调用Sphinx.Sphinx自带的API有PHP,Python,Ruby,Java等众多版本,所以基本也够用了,本人使用的编程语言是PHP所以下文的条用示例采用的是PHP版的API.

一.安装及配置Sphinx及准备测试数据 
1.安装前的准备工作 
(1)请确认安装了MySQL,Gcc及常用的开发环境包 
(2)下载sphinx-for-chinese-1.10.1(sphinx-for-chinese官方下载)及中文分词词典xdict_1.1

$ cd /usr/local/src
$ wget -c http://sphinx-for-chinese.googlecode.com/files/sphinx-for-chinese-1.10.1-dev-r2287.tar.gz
$ wget -c http://sphinx-for-chinese.googlecode.com/files/xdict_1.1.tar.gz

2.安装sphinx-for-chinese-1.10.1 

$ cd /usr/local/src
$ tar zxvf sphinx-for-chinese-1.10.-dev-r2287.tar.gz
$ cd sphinx-for-chinese-1.10.-dev-r2287
#MySQL安装在默认位置的使用如下命令
$ ./configure --prefix=/usr/local/sphinx-for-chinese-1.10. --with-mysql

如果出现如下图所示错误,表明MySQL不是安装在默认位置,请执行下面的命令

#如果MySQL不是安装在默认位置(特别是自己编译MySQL的,请注意),请指定MySQL的相关位置,主要是MySQL的include和lib目录(Sphinx编译的时候要用到里面的.h头文件),--with-mysql-includes及--with-mysql-libs就是为了指定这两个位置的

./configure --prefix=/usr/local/sphinx-for-chinese-1.10. --with-mysql-includes=/usr/local/webserver/mysql/include/mysql --with-mysql-libs=/usr/local/webserver/mysql/lib/mysql

显示如下图所示内容时,表示可以接着执行下面的make及make install命令

$ make
$ make install
#最后执行命令
$ ls /usr/local/sphinx-for-chinese-1.10./

如果显示bin,etc和var三个目录表示安装成功

3.让Sphinx支持中文分词

$ cd /usr/local/src
$ tar zxvf xdict_1..tar.gz
$ /usr/local/sphinx-for-chinese-1.10./bin/mkdict xdict_1..txt xdict_1.

如果提示bin/mkdict: error while loading shared libraries: libmysqlclient.so.16等错误(以下命令中的libmysqlclient.so.16.0.0的位置取决于我们mysql编译安装的位置)

ln -s /usr/local/webserver/mysql/lib/mysql/libmysqlclient.so.16.0. /usr/lib/libmysqlclient.so.

再次执行

$ /usr/local/sphinx-for-chinese-1.10./bin/mkdict xdict_1..txt xdict_1.
#提示Chinese dictionary was successfully created!表示中文分词词典生成成功
$ cp xdict_1. /usr/local/sphinx-for-chinese-1.10./etc/xdict_1.

4.配置Sphinx

vi /usr/local/sphinx-for-chinese-1.10./etc/sphinx.conf

输入以下内容

# sphinx基本配置
# 索引源
source goods_src
{
# 数据库类型
type = mysql
# MySQL主机IP
sql_host = localhost
# MySQL用户名
sql_user = sphinxuser
# MySQL密码
sql_pass = sphinxpass
# MySQL数据库
sql_db = sphinx
# MySQL端口(如果防火墙有限制,请开启)
sql_port=
# MySQL sock文件设置(默认为/tmp/mysql.sock,如果不一样,请指定)
sql_sock = /tmp/mysql.sock
# MySQL检索编码(数据库非utf8的很可能检索不到)
sql_query_pre = SET NAMES UTF8
# 获取数据的SQL语句
sql_query = SELECT goods_id,goods_id AS goods_id_new,goods_name,goods_color,goods_name AS goods_name_search,goods_color AS goods_color_search From goods_test
# 以下是用来过滤或条件查询的属性(以下字段显示在查询结果中,不在下面的字段就是搜索时要搜索的字段,如SQL语句中的goods_color_search,goods_name_search)
# 无符号整型
#goods_id为主键,如果加在这里在生成索引的时候会报attribute 'goods_id' not found,这里用goods_id_new来变通
sql_attr_uint = goods_id_new
# 字符串类型
sql_attr_string = goods_name
sql_attr_string = goods_color
# 用于命令界面端(CLI)调用的测试(一般来说不需要)
#sql_query_info = SELECT * FROM goods_test Where goods_id = $goods_id;
}
# 索引
index goods
{
# 索引源声明
source = goods_src
# 索引文件的存放位置
path = /usr/local/sphinx-for-chinese-1.10./var/data/goods
# 文件存储模式(默认为extern)
docinfo = extern
# 缓存数据内存锁定
mlock =
# 马氏形态学(对中文无效)
morphology = none
# 索引词最小长度
min_word_len =
# 数据编码(设置成utf8才能索引中文)
charset_type = utf-
# 中文分词词典
chinese_dictionary = /usr/local/sphinx-for-chinese-1.10./etc/xdict_1.
# 最小索引前缀长度
min_prefix_len =
# 最小索引中缀长度
min_infix_len =
# 对于非字母型数据的长度切割(for CJK indexing)
ngram_len =
# 对否对去除用户输入查询内容的html标签
html_strip =
}
# 索引器设置
indexer
{
# 内存大小限制 默认是 32M, 最大 2047M, 推荐为 256M 到 1024M之间
mem_limit = 256M
}
# sphinx服务进程search的相关配置
searchd
{
# 监测端口及形式,一下几种均可,默认为本机9312端口
# listen = 127.0.0.1
# listen = 192.168.0.1:
# listen =
# listen = /var/run/searchd.sock
# search进程的日志路径
log = /usr/local/sphinx-for-chinese-1.10./var/log/searchd.log
# 查询日志地址
query_log = /usr/local/sphinx-for-chinese-1.10./var/log/query.log
# 读取超时时间
read_timeout =
# 请求超时市时间
client_timeout =
# searche进程的最大运行数
max_children =
# 进程ID文件
pid_file = /usr/local/sphinx-for-chinese-1.10./var/log/searchd.pid
# 最大的查询结果返回数
max_matches =
# 是否支持无缝切换(做增量索引时需要)
seamless_rotate =
# 在启动运行时是否提前加载所有索引文件
preopen_indexes =
# 是否释放旧的索引文件
unlink_old =
# MVA跟新池大小(默认为1M)
mva_updates_pool = 1M
# 最大允许的网络包大小(默认8M)
max_packet_size = 8M
# 每个查询最大允许的过滤器数量(默认256)
max_filters =
#每个过滤器最大允许的值的个数(默认4096)
max_filter_values =
# 每个组的最大查询数(默认为32)
max_batch_queries =
}
# Sphinx配置文件结束

中文在linux下可能会看到乱码,不用管

5.创建测试数据库并添加测试内容(请先连上自己的MySQL数据库)

在MySQL中执行如下命令

mysql> create database sphinx collate 'utf8_general_ci';
mysql> grant all privileges on sphinx.* to 'sphinxuser'@'' identified by 'sphinxpass';
mysql> grant all privileges on sphinx.* to 'sphinxuser'@'localhost' identified by 'sphinxpass';
mysql> use sphinx;
mysql> CREATE TABLE IF NOT EXISTS `goods_test` (
`goods_id` int() unsigned NOT NULL AUTO_INCREMENT COMMENT '商品id',
`goods_name` varchar() NOT NULL COMMENT '商品名称',
`goods_color` varchar() NOT NULL COMMENT '商品颜色',
PRIMARY KEY (`goods_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='商品表,sphinx示例' AUTO_INCREMENT= ;
mysql> INSERT INTO `goods_test` (`goods_id`, `goods_name`, `goods_color`) VALUES
(, '热卖时尚双肩背包', '黑色'),
(, '热卖时尚电脑双肩背包', '灰色'),
(, '缤纷炫动时尚化妆包', '黑色'),
(, '缤纷炫动时尚化妆包', '蓝色'),
(, '缤纷炫动时尚化妆包', '粉红'),
(, '极致性感 女款衬衫', '黑色'),
(, '个性宣言 男款短袖衬衫', '蓝色'),
(, '个性宣言 男款短袖衬衫', '红色'),
(, '个性宣言 男款短袖衬衫', '绿色'),
(, '个性宣言 男款短袖衬衫', '黑色');

好了,万事俱备了,可以开始实战操作Sphinx了

二.实战操作Sphinx 
1.建立索引(如果配置文件有改动,应该重新生成索引文件,如果下面第3点中的searchd进程已经开启的话,应先关闭)

#生成goods索引[需要确保要连接的主机的MySQL数据库正常运行,并且3306端口可以访问]
/usr/local/sphinx-for-chinese-1.10./bin/indexer -c /usr/local/sphinx-for-chinese-1.10./etc/sphinx.conf goods

#如果配置文件里有多个索引,需要一次生成使用--all参数

/usr/local/sphinx-for-chinese-1.10./bin/indexer -c /usr/local/sphinx-for-chinese-1.10./etc/sphinx.conf --all

2.在linux命令行下测试搜索

/usr/local/sphinx-for-chinese-1.10./bin/search -c /usr/local/sphinx-for-chinese-1.10./etc/sphinx.conf 个性黑色

搜索结果如下图示:

3.开启守护进程(供API调用,如果配置文件改动,应重新启动这个进程,不然搜到的数据不是最新)

/usr/local/sphinx-for-chinese-1.10./bin/searchd -c /usr/local/sphinx-for-chinese-1.10./etc/sphinx.conf &      #执行后记得再按回车

# 防火墙需要开放9312端口供外部访问9312端口(3306是MySQL的端口)

/sbin/iptables -I INPUT -p tcp --dport  -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport -j ACCEPT
/etc/rc.d/init.d/iptables save

三.外部API调用(PHP版) 
注意使用时前提是执行了以上的步骤3.开启守护进程,而且防火墙也开启了9312端口

1.把/usr/local/src/sphinx-for-chinese-1.10.1-dev-r2287/api/sphinxapi.php弄出来,和下面第2点中的search.php放在同级目录(这个只是示例,放在哪里都可以,包含的时候找到正确的sphinxapi.php的位置即可) 
2.编辑search.php文件,内容如下(具体内容请读者自己定,我这里只是示例)

<?php
header ( 'Content-Type: text/html;charset="UTF-8"' );
if ($_GET) {
// 关键词
$keyword = urldecode ( trim ( strip_tags ( $_GET ['keyword'] ) ) );
if ($keyword) {
// 包含Sphinx的api文件
require_once 'sphinxapi.php';
// sphinx服务器地址
$server = '192.168.128.130';
// 端口
$port = ;
// 索引名 为*时表示搜索所有索引
$indexName = 'goods';
// 分页页码
$page = intval ( $_GET ['page'] ) > ? intval ( $_GET ['page'] ) : ;
// 每页显示的数量
$pageSize = ;
$sphinx = new SphinxClient ();
// 建立连接
$sphinx->SetServer ( $server, $port );
// 连接超时时间(非常必要,比如sphinx服务器挂了等异常情况) 单位为s,秒
$sphinx->SetConnectTimeout ( );
// 最大查询时间 单位为ms,毫秒
$sphinx->SetMaxQueryTime ( );
// 按分页取结果
$sphinx->SetLimits ( ($page - ) * $pageSize, $pageSize ); //第一个参数为offset,第二个参数为limit
// 模式
// $sphinx->SetMatchMode(SPH_MATCH_EXTENDED);
// 取到的原始数据
$orgDatas = $sphinx->Query ( $keyword, $indexName );
// 调试用,如果有错误的话,可以打印$errors的值
$errors = $sphinx->GetLastError ();
var_dump ( $errors );
echo '<pre>';
var_dump ( $orgDatas );
/* // 下面是对结果的处理
$datas = array('goods'=>array(),'total'=>0);
if ($orgDatas['total'] > 0) {
$datas['total'] = $orgDatas['total'];
foreach ($orgDatas['matches'] AS $val) {
$val['attrs']['goods_id'] = $val['attrs']['goods_id_new'];
unset($val['attrs']['goods_id_new']);
$datas['goods'][] = $val['attrs'];
}
}
var_dump($datas);
*/
}
} else {
echo '<form method="get"><input type="type" name="keyword"><input type="submit" value="商品搜索"></form>';
}
?>

更多详细配置请参看/usr/local/sphinx-for-chinese-1.10.1/etc/sphinx.conf.dist文件里面有包括实时索引,增量索引等很多内容,英文原版的,很详细

Sphinx中文分词详细安装配置及API调用实战的更多相关文章

  1. Sphinx中文分词安装配置及API调用

    这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议这两个中选择一个,暂 ...

  2. (转)Sphinx中文分词安装配置及API调用

    这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议这两个中选择一个,暂 ...

  3. Centos下Sphinx中文分词编译安装测试---CoreSeek

    要支持中文分词,还需要下载Coreseek,可以去官方搜索下载,这里我用的4.1 百度云下载地址:      https://pan.baidu.com/s/1slNIyHf tar -zxvf co ...

  4. 【转】Syncthing – 数据同步利器---自己的网盘,详细安装配置指南,内网使用,发现服务器配置

    Syncthing – 数据同步利器---自己的网盘,详细安装配置指南,内网使用,发现服务器配置 原贴:https://www.cnblogs.com/jackadam/p/8568833.html ...

  5. Elasticsearch 中文分词(elasticsearch-analysis-ik) 安装

    由于elasticsearch基于lucene,所以天然地就多了许多lucene上的中文分词的支持,比如 IK, Paoding, MMSEG4J等lucene中文分词原理上都能在elasticsea ...

  6. Tomcat7.0/8.0 详细安装配置图解,以及UTF-8编码配置

    Tomcat7.0/8.0 详细安装配置图解,以及UTF-8编码配置 2017年01月24日 10:01:48 阅读数:51265 标签: tomcattomcat安装tomcat配置tomcat编码 ...

  7. 搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例(转)

    一个文档包含了安装.增量备份.扩展.api调用示例,省去了查找大量文章的时间. 搭建coreseek(sphinx+mmseg3)安装 [第一步] 先安装mmseg3 cd /var/install ...

  8. windows 下android react native详细安装配置过程

    写在前面: 在网上搜了很多安装配置文档,感觉没有一个真的跟我安装的过程一模一样的,东拼拼西凑凑,总算是装好了,我不会告诉你,断断续续,我花了两天时间...一到黑屏报错就傻眼,幸好在react群里遇到了 ...

  9. elastic-search单机部署以及中文分词IKAnalyzer安装

    前提条件 elasticsearch使用版本5.6.3,需要jdk版本1.8,低于该版本不能使用 下载 https://artifacts.elastic.co/downloads/elasticse ...

随机推荐

  1. 黄聪:MYSQL使服务器内存CPU占用过高问题的分析及解决方法

    方法一: 使用 show processlist 语句,查找负荷最重的 SQL 语句,优化该SQL,比如适当建立某字段的索引. 方法二: #查看慢SQL日志是否启用mysql> show var ...

  2. Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)

    今天遇到一个项目中用到Android 6.0的系统,但是有个文件是从Assert目录下写到SDCard中,但是AndroidMinifest.xml中已经加了文件的读权限和写权限,异常日志是在创建文件 ...

  3. Hbase集群搭建及所有配置调优参数整理及API代码运行

    最近为了方便开发,在自己的虚拟机上搭建了三节点的Hadoop集群与Hbase集群,hadoop集群的搭建与zookeeper集群这里就不再详细说明,原来的笔记中记录过.这里将hbase配置参数进行相应 ...

  4. pandas入门

    [原]十分钟搞定pandas   本文是对pandas官方网站上<10 Minutes to pandas>的一个简单的翻译,原文在这里.这篇文章是对pandas的一个简单的介绍,详细的介 ...

  5. [IIS]IIS扫盲(三)

      IIS扫盲贴 --==[精品]==--   IIS扫盲贴     --==[精品]==-- 2000对应iis5.0  xp对应iis5.1  2003对应iis6.0        作者: II ...

  6. floyd

    求任意两点之间的最短路径.e[i][j]为记录从i到j之间的距离,当循环结束后最后存储的就是i到j之间的最短路径啦. floyd算法就是对于给定的n个结点,对于每一个e[i][j],都让它经过1,然后 ...

  7. IIS7 IIS7.5 IIS8.5 HTTP 错误 500.19 – Internal Server Error解决方案小记

    今天配置IIS(win8.1 IIS8.5)的web.config出现如下错误: HTTP 错误 500.19 – Internal Server Error无法访问请求的页面,因为该页的相关配置数据 ...

  8. IQ推理:P先生和Q先生

    P先生.Q先生具有足够的推理能力.这天,他们正在接受面试. 他们知道桌子的抽屉里有16张扑克牌:红桃 A Q 4黑桃 J 8 4 2 7 3草花 K Q 5 4 6方块 A 5约瀚教授从这16张牌中挑 ...

  9. 有了第一台自己开发的pro,开心,明天分享最近整理逆向分析ios的一些东西

    最近都在忙于ios深入研究,研究别人的代码,别人的app.然后顺藤摸瓜的找到了关键:逆向,动态特性等. 相关工具:reveal, cycript等. 特别感谢前人的分享,为了打开学习ios的另外一扇大 ...

  10. 使用jna调用dll,jdk位数和dll位数的关系

    最近在学习jna,发现dll文件能能否成功调用取决于jdk位数. 32位jdk只能使用32位的dll,64位jdk只能使用64位的dll,否则位数不对应的话报的错是 "Exception i ...