千家信息网

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

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,下面讲讲关于sphinx结合scws对mysql实现全文检索,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完sphinx结合scws对mysql实现全文检索这篇文章你一定会
千家信息网最后更新 2026年11月02日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;

对于以上sphinx结合scws对mysql实现全文检索相关内容,大家还有什么不明白的地方吗?或者想要了解更多相关,可以继续关注我们的行业资讯板块。

索引 数据 服务 搜索 支持 检索 增量 配置 全文 服务器 版本 中文 测试 全文检索 地址 分布式 引擎 系统 多个 文档 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广东猪兼强互联网科技有限公司 河南云网互联网络科技有限公司 云之行互联网科技 互联网科技公司的优势 智能科技公司是互联网公司吗 没上市的科技互联网公司 万易互联网科技 互联网科技小贷 深圳天众互联网科技公司 亿人帮互联网科技 承德科技产业互联网发展 浙南科技城互联网大厦建设工程 广州富喜互联网络科技 中国新注册互联网科技 互联网领先科技活动 银川新华互联网科技学校原画 求路客互联网科技电话 盐城市攀科互联网科技有限公司 恒生互联网科技趋势 网互联网络科技 南京欣网互联网络科技有限公司 山东特亿宝互联网科技有限公司 哈尔滨秒房互联网科技有限公司 山东吉时兔互联网科技有限公司 华服互联网科技官网 燊美集互联网科技有限公司 南博望互联网科技有限公司 卓翼科技产业互联网合作 互联网科技机房 银川新华互联网科技学校招聘
0