博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Sphinx中文分词详细安装配置及API调用实战
阅读量:5741 次
发布时间:2019-06-18

本文共 8233 字,大约阅读时间需要 27 分钟。

这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用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.1-dev-r2287.tar.gz $ cd sphinx-for-chinese-1.10.1-dev-r2287 #MySQL安装在默认位置的使用如下命令 $ ./configure --prefix=/usr/local/sphinx-for-chinese-1.10.1 --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.1 --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.1/

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

3.让Sphinx支持中文分词

$ cd /usr/local/src$ tar zxvf xdict_1.1.tar.gz $ /usr/local/sphinx-for-chinese-1.10.1/bin/mkdict xdict_1.1.txt xdict_1.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.0 /usr/lib/libmysqlclient.so.16

再次执行

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

4.配置Sphinx

vi /usr/local/sphinx-for-chinese-1.10.1/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= 3306     # 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.1/var/data/goods    # 文件存储模式(默认为extern)     docinfo = extern     # 缓存数据内存锁定     mlock = 0     # 马氏形态学(对中文无效)     morphology = none     # 索引词最小长度     min_word_len = 1     # 数据编码(设置成utf8才能索引中文)     charset_type = utf-8     # 中文分词词典     chinese_dictionary = /usr/local/sphinx-for-chinese-1.10.1/etc/xdict_1.1     # 最小索引前缀长度     min_prefix_len = 0     # 最小索引中缀长度     min_infix_len = 1     # 对于非字母型数据的长度切割(for CJK indexing)     ngram_len = 1     # 对否对去除用户输入查询内容的html标签     html_strip = 0 } # 索引器设置 indexer {     # 内存大小限制 默认是 32M, 最大 2047M, 推荐为 256M 到 1024M之间     mem_limit = 256M } # sphinx服务进程search的相关配置 searchd {     # 监测端口及形式,一下几种均可,默认为本机9312端口     # listen = 127.0.0.1     # listen = 192.168.0.1:9312     # listen = 9312     # listen = /var/run/searchd.sock     # search进程的日志路径     log = /usr/local/sphinx-for-chinese-1.10.1/var/log/searchd.log     # 查询日志地址     query_log = /usr/local/sphinx-for-chinese-1.10.1/var/log/query.log     # 读取超时时间     read_timeout = 5     # 请求超时市时间     client_timeout = 300     # searche进程的最大运行数     max_children = 30     # 进程ID文件     pid_file = /usr/local/sphinx-for-chinese-1.10.1/var/log/searchd.pid     # 最大的查询结果返回数     max_matches = 1000     # 是否支持无缝切换(做增量索引时需要)     seamless_rotate = 1     # 在启动运行时是否提前加载所有索引文件     preopen_indexes = 0     # 是否释放旧的索引文件     unlink_old = 1     # MVA跟新池大小(默认为1M)     mva_updates_pool = 1M     # 最大允许的网络包大小(默认8M)     max_packet_size = 8M     # 每个查询最大允许的过滤器数量(默认256)     max_filters = 256     #每个过滤器最大允许的值的个数(默认4096)     max_filter_values = 4096     # 每个组的最大查询数(默认为32)     max_batch_queries = 32 } # 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(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品id',`goods_name` varchar(255) NOT NULL COMMENT '商品名称',`goods_color` varchar(60) NOT NULL COMMENT '商品颜色',PRIMARY KEY (`goods_id`)) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='商品表,sphinx示例' AUTO_INCREMENT=11 ;mysql> INSERT INTO `goods_test` (`goods_id`, `goods_name`, `goods_color`) VALUES(1, '热卖时尚双肩背包', '黑色'),(2, '热卖时尚电脑双肩背包', '灰色'),(3, '缤纷炫动时尚化妆包', '黑色'),(4, '缤纷炫动时尚化妆包', '蓝色'),(5, '缤纷炫动时尚化妆包', '粉红'),(6, '极致性感 女款衬衫', '黑色'),(7, '个性宣言 男款短袖衬衫', '蓝色'),(8, '个性宣言 男款短袖衬衫', '红色'),(9, '个性宣言 男款短袖衬衫', '绿色'),(10, '个性宣言 男款短袖衬衫', '黑色');

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

二.实战操作Sphinx 

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

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

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

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

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

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

搜索结果如下图示:

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

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

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

/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT/sbin/iptables -I INPUT -p tcp --dport 9312 -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文件,内容如下(具体内容请读者自己定,我这里只是示例) 

1 ? intval ( $_GET ['page'] ) : 1; // 每页显示的数量 $pageSize = 30; $sphinx = new SphinxClient (); // 建立连接 $sphinx->SetServer ( $server, $port ); // 连接超时时间(非常必要,比如sphinx服务器挂了等异常情况) 单位为s,秒 $sphinx->SetConnectTimeout ( 3 ); // 最大查询时间 单位为ms,毫秒 $sphinx->SetMaxQueryTime ( 2000 ); // 按分页取结果 $sphinx->SetLimits ( ($page - 1) * $pageSize, $pageSize ); //第一个参数为offset,第二个参数为limit // 模式 // $sphinx->SetMatchMode(SPH_MATCH_EXTENDED); // 取到的原始数据 $orgDatas = $sphinx->Query ( $keyword, $indexName ); // 调试用,如果有错误的话,可以打印$errors的值 $errors = $sphinx->GetLastError (); var_dump ( $errors ); echo '
';        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 '
';}?>

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

转载于:https://www.cnblogs.com/liliuguang/p/9578879.html

你可能感兴趣的文章
Tomcat部署Web应用方法总结
查看>>
Python3 django2.0 字段加密 解密 AES
查看>>
CCNA实验之:网络地址转换(NAT)实验
查看>>
计算机网络原理笔记-停止等待协议
查看>>
确定当前记录和下一条记录之间相差的天数
查看>>
sql语句返回主键SCOPE_IDENTITY()
查看>>
机器学习开源项目精选TOP30
查看>>
iOS开发-邮件发送
查看>>
/etc/resolv.conf文件详解
查看>>
【转】VC的MFC中重绘函数的使用总结(整理)
查看>>
JQuery日记_5.13 Sizzle选择器(六)选择器的效率
查看>>
oracle查看经常使用的系统信息
查看>>
Django_4_视图
查看>>
Linux的netstat命令使用
查看>>
lvm讲解,磁盘故障小案例
查看>>
大快网站:如何选择正确的hadoop版本
查看>>
经过这5大阶段,你离Java程序员就不远了!
查看>>
IntelliJ IDEA 连接数据库详细过程
查看>>
thymeleaf 学习笔记-基础篇
查看>>
PHP-X开发扩展
查看>>