sphinx结合scws的mysql全文检索

栏目: 数据库 · 发布时间: 7年前

内容简介:主要目的:打造千万级数据全文搜索的数据库,提升查询效率系统环境一、简介

主要目的:打造千万级数据全文搜索的数据库,提升查询效率

系统环境

主机名

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 年底。

sphinx结合scws的mysql全文检索 sphinx结合scws的mysql全文检索

二、环境准备

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

sphinx结合scws的mysql全文检索 sphinx结合scws的mysql全文检索

# ./configure --with-sphinx=/usr/local/sphinx/libsphinxclient/ --with-php-config=/usr/bin/php-config

# make && make install

# 成功后会提示:

Installing shared extensions:     /usr/lib64/php/modules/

sphinx结合scws的mysql全文检索 sphinx结合scws的mysql全文检索

#修改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结合scws的mysql全文检索 sphinx结合scws的mysql全文检索

#启动sphinx

# ./searchd -c /usr/local/sphinx/etc/sphinx.conf

sphinx结合scws的mysql全文检索 sphinx结合scws的mysql全文检索

#查看进程

# ps -ef | grep searchd

sphinx结合scws的mysql全文检索 sphinx结合scws的mysql全文检索

#查看状态

# ./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 -h172.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 -h172.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

sphinx结合scws的mysql全文检索 sphinx结合scws的mysql全文检索

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

sphinx结合scws的mysql全文检索 sphinx结合scws的mysql全文检索

# make && make install

编译完成状态如下:

sphinx结合scws的mysql全文检索 sphinx结合scws的mysql全文检索

#修改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、词库安装

sphinx结合scws的mysql全文检索 sphinx结合scws的mysql全文检索

下载地址: 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

代码省略

访问:

sphinx结合scws的mysql全文检索 sphinx结合scws的mysql全文检索

2、SphinxQL测试

要使用SphinxQL需要在Searchd的配置里面增加相应的监听端口(参考上文配置)。

# mysql -h127.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全文检索 sphinx结合scws的mysql全文检索


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JavaScript and Ajax for the Web, Sixth Edition

JavaScript and Ajax for the Web, Sixth Edition

Tom Negrino、Dori Smith / Peachpit Press / August 28, 2006 / $24.99

Book Description Need to learn JavaScript fast? This best-selling reference’s visual format and step-by-step, task-based instructions will have you up and running with JavaScript in no time. In thi......一起来看看 《JavaScript and Ajax for the Web, Sixth Edition》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具