加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

sphinx融合scws对mysql实现全文检索

发布时间:2023-11-03 14:56:30 所属栏目:MySql教程 来源:
导读:下面讲讲关于sphinx结合scws对mysql实现全文检索,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完sphinx结合scws对mysql实现全文检索这篇文章你一定会有所受益。

系统环境

下面讲讲关于sphinx结合scws对mysql实现全文检索,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完sphinx结合scws对mysql实现全文检索这篇文章你一定会有所受益。
 
系统环境
 
主机名
 
IP地址
 
相关服务
 
版本
 
SQL
 
172.169.18.128
 
mysql5.6(主)

Sphinx
 
172.169.18.210
 
mysql5.6(从)php5.6
 
Apache2.4
 
sphinx版本:2.2.10
 
sphinx插件:1.3.3
 
scws分词版本:1.2.3
 
一、简介
 
1.1、 Sphinx是什么
 
参考地址:http://www.sphinxsearch.org/sphinx-tutorial
 
Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎。意图为其他应用提供高速、低空间占用、高结果 相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和脚本语言集成。当前系统内置MySQL和PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式 的XML数据。
 
Sphinx创建索引的速度为:创建100万条记录的索引只需3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。
 
1.2、 Sphinx的特性如下:
 
(1)高速的建立索引(在当代CPU上,峰值性能可达到10 MB/秒);
 
(2)高性能的搜索(在2 – 4GB 的文本数据上,平均每次检索响应时间小于0.1秒);
 
(3)可处理海量数据(目前已知可以处理超过100 GB的文本数据, 在单一CPU的系统上可处理100 M 文档);
 
(4)提供了优秀的相关度算法,基于短语相似度和统计(BM25)的复合Ranking方法;
 
(5) 支持分布式搜索;
 
(6)支持短语搜索
 
(7)提供文档摘要生成
 
(8)可作为MySQL的存储引擎提供搜索服务;
 
(9)支持布尔、短语、词语相似度等多种检索模式;
 
(10)文档支持多个全文检索字段(最大不超过32个);
 
(11)文档支持多个额外的属性信息(例如:分组信息,时间戳等);
 
(12)支持断词;
 
  1.3、总结
 
  优点:效率较高,具有较高的扩展性
 
缺点:不负责数据存储
 
使用Sphinx搜索引擎对数据做索引,数据一次性加载进来,然后做了所以之后保存在内存。这样用户进行搜索的时候就只需要在Sphinx云服务器上检索数据即可。而且,Sphinx没有MySQL的伴随机磁盘I/O的缺陷,性能更佳。

2.1、SCWS 是 Simple Chinese Word Segmentation 的首字母缩写(即:简易中文分词系统)。
 
参考地址:http://www.xunsearch.com/scws/index.php    
 
这是一套基于词频词典的机械式中文分词引擎,它能将一整段的中文文本基本正确地切分成词。 词是中文的最小语素单位,但在书写时并不像英语会在词之间用空格分开, 所以如何准确并快速分词一直是中文分词的攻关难点。
 
2.2、特性
 
SCWS 采用纯 C 语言开发,不依赖任何外部库函数,可直接使用动态链接库嵌入应用程序, 支持的中文编码包括 GBK、UTF-8 等。此外还提供了 PHP 扩展模块, 可在 PHP 中快速而方便地使用分词功能。
 
分词算法上并无太多创新成分,采用的是自己采集的词频词典,并辅以一定的专有名称,人名,地名, 数字年代等规则识别来达到基本分词,经小范围测试准确率在 90% ~ 95% 之间, 基本上能满足一些小型搜索引擎、关键字提取等场合运用。首次雏形版本发布于 2005 年底。
 
二、环境准备
 
1、暂时关闭防火墙
 
2、关闭seliunx
 
3、系统环境
 
centos7.4 mysql5.6 php5.6
 
三、搭建Sphinx服务
 
1、安装依赖包
 
# yum -y install make gcc gcc-c++ libtool autoconf automake mysql-devel
 
2、安装Sphinx
 
# yum install expat expat-devel
 
# wget -c http://sphinxsearch.com/files/sphinx-2.2.10-release.tar.gz
 
# tar -zxvf sphinx-2.2.10-release.tar.gz
 
# cd sphinx-2.2.10-release/
 
# ./configure --prefix=/usr/local/sphinx  --with-mysql --with-libexpat --enable-id64
 
# make && make install
 
3、安装libsphinxclient,php扩展用到
 
# cd api/libsphinxclient/
 
# ./configure --prefix=/usr/local/sphinx/libsphinxclient
 
# make && make install
 
安装完毕后查看一下/usr/local/sphinx下是否有 三个目录 bin etc var,如有,则安装无误!
 
4、安装Sphinx的PHP扩展:我的是5.6需装sphinx-1.3.3.tgz,如果是php5.4以下可sphinx-1.3.0.tgz,如果php7.0需要安装sphinx-339e123.tar.gz(http://git.php.net/?p=pecl/search_engine/sphinx.git;a=snapshot;h=339e123acb0ce7beb2d9d4f9094d6f8bcf15fb54;sf=tgz)
 
# wget -c  http://pecl.php.net/get/sphinx-1.3.3.tgz
 
# tar zxvf sphinx-1.3.3.tgz
 
# cd sphinx-1.3.3/
 
# phpize
 
# ./configure --with-sphinx=/usr/local/sphinx/libsphinxclient/ --with-php-config=/usr/bin/php-config
 
 # make && make install
 
# 成功后会提示:  
 
Installing shared extensions:     /usr/lib64/php/modules/
 
#修改php配置
 
# echo "[Sphinx]" >> /etc/php.ini
 
# echo "extension = sphinx.so" >> /etc/php.ini
 
#重启httpd服务  
 
# systemctl restart httpd.service
 
5、创建测试数据进行测试(db:jiangjj)
 
CREATE TABLE IF NOT EXISTS `items` (
 
`id` int(11) NOT NULL AUTO_INCREMENT,
 
`title` varchar(255) NOT NULL,
 
`content` text NOT NULL,
 
`created` datetime NOT NULL,
 
PRIMARY KEY (`id`)
 
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='全文检索测试的数据表' AUTO_INCREMENT=11 ;
 
INSERT INTO `items` (`id`, `title`, `content`, `created`) VALUES
 
(1, 'linux mysql集群安装', 'MySQL Cluster 是MySQL 适合于分布式计算环境的高实用、可拓展、高性能、高冗余版本', '2016-09-07 00:00:00'),
 
(2, 'mysql主从复制', 'mysql主从备份(复制)的基本原理 mysql支持单向、异步复制,复制过程中一个云服务器充当主云服务器,而一个或多个其它云服务器充当从云服务器', '2016-09-06 00:00:00'),
 
(3, 'hello', 'can you search me?', '2016-09-05 00:00:00'),
 
(4, 'mysql', 'mysql is the best database?', '2016-09-03 00:00:00'),
 
(5, 'mysql索引', '关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车', '2016-09-01 00:00:00'),
 
(6, '集群', '关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车', '0000-00-00 00:00:00'),
 
(9, '复制原理', 'redis也有复制', '0000-00-00 00:00:00'),
 
(10, 'redis集群', '集群技术是构建高性能网站架构的重要手段,试想在网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,并快速响应,我们必然想到的是将数据进行切片,把数据根据某种规则放入多个不同的云服务器节点,来降低单节点云服务器的压力', '0000-00-00 00:00:00');
 
CREATE TABLE IF NOT EXISTS `sph_counter` (
 
`counter_id` int(11) NOT NULL,
 
`max_doc_id` int(11) NOT NULL,
 
PRIMARY KEY (`counter_id`)
 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='增量索引标示的计数表';
 
6、Sphinx配置:注意修改数据源配置信息。
 
配置地址:http://www.cnblogs.com/yjf512/p/3598332.html
 
以下采用"Main + Delta" ("主索引"+"增量索引")的索引策略,使用Sphinx自带的一元分词。
 
# vim /usr/local/sphinx/etc/sphinx.conf
 
source items {
 
type = mysql
 
sql_host = 172.169.18.128
 
sql_user = jiangjj
 
sql_pass = 123456
 
sql_db = jiangjj
 
sql_query_pre = SET NAMES utf8
 
sql_query_pre = SET SESSION query_cache_type = OFF
 
sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM items
 
sql_query_range = SELECT MIN(id), MAX(id) FROM items \
 
WHERE id<=(SELECT max_doc_id FROM sph_counter WHERE counter_id=1)
 
sql_range_step = 1000
 
sql_ranged_throttle = 1000
 
sql_query = SELECT id, title, content, created, 0 as deleted FROM items \
 
WHERE id<=(SELECT max_doc_id FROM sph_counter WHERE counter_id=1) \
 
AND id >= $start AND id <= $end
 
sql_attr_timestamp = created
 
sql_attr_bool = deleted
 
}
 
source items_delta : items {
 
sql_query_pre = SET NAMES utf8
 
sql_query_range = SELECT MIN(id), MAX(id) FROM items \
 
WHERE id > (SELECT max_doc_id FROM sph_counter WHERE counter_id=1)
 
sql_query = SELECT id, title, content, created, 0 as deleted FROM items \
 
WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) \
 
AND id >= $start AND id <= $end
 
sql_query_post_index = set @max_doc_id :=(SELECT max_doc_id FROM sph_counter WHERE counter_id=1)
 
sql_query_post_index = REPLACE INTO sph_counter SELECT 2, IF($maxid, $maxid, @max_doc_id)
 
}
 
#主索引
 
index items {
 
source = items
 
path = /usr/local/sphinx/var/data/items
 
docinfo = extern
 
morphology = none
 
min_word_len = 1
 
min_prefix_len = 0
 
html_strip = 1
 
html_remove_elements = style, script
 
ngram_len = 1
 
ngram_chars = U+3000..U+2FA1F
 
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
 
preopen = 1
 
min_infix_len = 1
 
}
 
#增量索引
 
index items_delta : items {
 
source = items_delta
 
path = /usr/local/sphinx/var/data/items_delta
 
}
 
#分布式索引
 
index master {
 
type = distributed
 
local = items
 
local = items_delta
 
}
 
indexer {
 
mem_limit = 256M
 
}
 
searchd {
 
listen      = 9312
 
listen      = 9306:mysql41
 
log         = /usr/local/sphinx/var/log/searchd.log
 
query_log   = /usr/local/sphinx/var/log/query.log
 
#  compat_sphinxql_magics = 0
 
attr_flush_period      = 600
 
mva_updates_pool       = 16M
 
read_timeout           = 5
 
max_children           = 0
 
dist_threads           = 2
 
pid_file    = /usr/local/sphinx/var/log/searchd.pid
 
# max_marches = 1000
 
seamless_rotate        = 1
 
preopen_indexes        = 1
 
unlink_old             = 1
 
workers                = threads
 
binlog_path            = /usr/local/sphinx/var/data
 
}
 
7、Sphinx创建索引
 
# cd /usr/local/sphinx/bin/
 
#第一次重建索引
 
# ./indexer -c /usr/local/sphinx/etc/sphinx.conf --all
 
#启动sphinx
 
# ./searchd -c /usr/local/sphinx/etc/sphinx.conf
 
#查看进程
 
# ps -ef | grep searchd
 
#查看状态
 
# ./searchd -c /usr/local/sphinx/etc/sphinx.conf --status
 
#关闭sphinx
 
# ./searchd -c /usr/local/sphinx/etc/sphinx.conf --stop
 
8、索引更新及使用说明
 
"增量索引"每N分钟更新一次.通常在每天晚上低负载的时进行一次索引合并,同时重新建立"增量索引"。当然"主索引"数据不多的话,也可以直接重新建立"主索引"。
 
API搜索的时,同时使用"主索引"和"增量索引",这样可以获得准实时的搜索数据.本文的Sphinx配置将"主索引"和"增量索引"放到分布式索引master中,因此只需查询分布式索引"master"即可获得全部匹配数据(包括最新数据)。
 
索引的更新与合并的操作可以放到cron job完成:
 
8.1、编辑
 
# crontab -e
 
*/1 * * * *  /usr/local/sphinx/shell/index_update.sh
 
0   3 * * *  /usr/local/sphinx/shell/merge_index.sh
 
//查看
 
# crontab -l
 
8.2、脚本如下
 
#更新脚本
 
# vim /usr/local/sphinx/shell/index_update.sh
 
#!/bin/sh
 
/usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf --rotate items_delta > /dev/null 2>&1
 
#合并脚本
 
[root@Sphinx shell]# vim merge_index.sh
 
#!/bin/bash
 
indexer=/usr/local/sphinx/bin/indexer
 
mysql=`which mysql`
 
#host=172.169.18.128
 
#mysql_user=jiangjj
 
#mysql_password=123456
 
QUERY="use jiangjj;select max_doc_id from sph_counter where counter_id = 2 limit 1;"
 
index_counter=$($mysql -h272.169.18.128 -ujiangjj -p123456 -sN -e "$QUERY")
 
#merge "main + delta" indexes
 
$indexer -c /usr/local/sphinx/etc/sphinx.conf --rotate --merge items items_delta --merge-dst-range deleted 0 0 >> /usr/local/sphinx/var/index_merge.log 2>&1
 
if [ "$?" -eq 0 ]; then
 
   ##update sphinx counter
 
   if [ ! -z $index_counter ]; then
 
       $mysql -h272.169.18.128 -ujiangjj -p123456 -Djiangjj -e "REPLACE INTO sph_counter VALUES (1, '$index_counter')"
 
   fi
 
   ##rebuild delta index to avoid confusion with main index
 
   $indexer -c /usr/local/sphinx/etc/sphinx.conf --rotate items_delta >> /usr/local/sphinx/var/rebuild_deltaindex.log 2>&1
 
fi
 
#授权
 
# chmod u+x *.sh
 
测试没问题后继续下一步操作
 
四、搭建scws(中文分词)服务
 
下载地址:http://www.xunsearch.com/scws/download.php
 
1、scws下载安装:注意扩展的版本和php的版本
 
# wget -c http://www.xunsearch.com/scws/down/scws-1.2.3.tar.bz2
 
# tar jxvf scws-1.2.3.tar.bz2
 
# cd scws-1.2.3/
 
# ./configure --prefix=/usr/local/scws
 
# make && make install
 
2、scws的PHP扩展安装
 
# cd ./phpext/
 
# phpize
 
# ./configure
 
# make && make install

#修改php配置文件
 
[root@Sphinx ~]# echo "[scws]" >> /etc/php.ini
 
[root@Sphinx ~]# echo "extension = scws.so" >> /etc/php.ini
 
[root@Sphinx ~]# echo "scws.default.charset = utf-8" >> /etc/php.ini
 
[root@Sphinx ~]# echo "scws.default.fpath = /usr/local/scws/etc/" >> /etc/php.ini
 
3、词库安装
 
下载地址:http://www.xunsearch.com/scws/down/scws-dict-chs-utf8.tar.bz2
 
# wget http://www.xunsearch.com/scws/down/scws-dict-chs-utf8.tar.bz2
 
# tar jxvf scws-dict-chs-utf8.tar.bz2 -C /usr/local/sphinx/etc/
 
# chown -R apache:apache /usr/local/sphinx/etc/dict.utf8.xdb
 
五、php使用Sphinx+scws测试
 
1、在Sphinx源码API中,有好几种语言的API调用.其中有一个是sphinxapi.php。
 
新建一个Search.php文件,一个前端页面index.php
 
代码省略
 
访问:
 
2、SphinxQL测试
 
要使用SphinxQL需要在Searchd的配置里面增加相应的监听端口(参考上文配置)。
 
# mysql -h227.0.0.1 -P9306 -ujiangjj -p
 
mysql> show global variables;
 
mysql> desc items;
 
mysql> select * from master where match('mysql*') limit 10;
 
mysql> show meta;
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章