基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计

合集下载

Sphinx全文检索引

Sphinx全文检索引

Apache是什么?Apache是一个开源的Web服务器
2页
MySQL是什么?MySQL是一个开源的数据库
3页
PHP是什么?PHP是一个开源的脚本语言
4页
全文检索大体分两个过程:
索引创建(Indexer)和 搜索索引(Search)。 索引创建:将现实世界中所有的结构化和非结构化 数据提取信息,创建索引的过程。 搜索索引:就是得到用户的查询请求,搜索创建的 索引,然后返回结果的过程。
中文分词系统:
中文分词与英文分词有很大的不同, 英文一个单词就是一个词,而汉语是以字为基本的 书写单位,词语之间没有明显的区分标记,需要人 为切分。
中文分词系统,是利用计算机对中文文本进行词语 自动识别的系统,词语自动识别的方法我们通常称 为分词算法。
分词算法的分类:
主要有3大类: 1、 基于字符串匹配的分词方法。 2、 基于理解的分词方法。 3、 基于统计的分词方法
students but found them drunk (Tokenizer)。
分词组件(Tokenizer)会做以下几件事情(此过程称为Tokenize):
1. 将文档分成一个一个单独的单词。 2. 去除标点符号。 3. 去除停词(Stop word)。 所谓停词(Stop word)就是一种语言中最普通的一些单词: 英语中的停词(Stop word)如:“the”,“a”,“this”等。 中文中的停词 如:‘是’‘的’‘这个’等。 对于每一种语言的分词组件(Tokenizer),都有一个停词(stop word)集合。 经过分词(Tokenizer)后得到的结果称为词元(Token)。 在我们的例子中,便得到以下词元(Token): Students、allowed、go、their、friends、allowed、drink、beer、My、friend、Jerry、 went、school、see、his、students、found、them、drunk、allowed。

基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计

基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计

[文章作者:张宴本文版本:v1.0 最后修改:2008.07.27 转载请注明原文链接:/post/360/]前言:本文阐述的是一款经过生产环境检验的千万级数据全文检索(搜索引擎)架构。

本文只列出前几章的内容节选,不提供全文内容。

在DELL PowerEdge 6850服务器(四颗64 位Inter Xeon MP 7110N处理器/ 8GB内存)、RedHat AS4 Linux操作系统、MySQL 5.1.26、MyISAM存储引擎、key_buffer=1024M环境下实测,单表1000万条记录的数据量(这张MySQL表拥有int、datetime、varchar、text等类型的10多个字段,只有主键,无其它索引),用主键(PRIMARY KEY)作为WHERE条件进行SQL查询,速度非常之快,只耗费0.01秒。

出自俄罗斯的开源全文搜索引擎软件Sphinx,单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。

Sphinx创建索引的速度为:创建100万条记录的索引只需3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。

基于以上几点,我设计出了这套搜索引擎架构。

在生产环境运行了一周,效果非常不错。

有时间我会专为配合Sphinx搜索引擎,开发一个逻辑简单、速度快、占用内存低、非表锁的MySQL存储引擎插件,用来代替MyISAM引擎,以解决MyISAM存储引擎在频繁更新操作时的锁表延迟问题。

另外,分布式搜索技术上已无任何问题。

一、搜索引擎架构设计:1、搜索引擎架构图:2、搜索引擎架构设计思路:(1)、调用方式最简化:尽量方便前端Web工程师,只需要一条简单的SQL语句“SELECT ... FROM myisam_table JOIN sphinx_table ON (sphinx_table.sphinx_id=myisam_table.id) WHERE query='...';”即可实现高效搜索。

PHP+Mysql+Sphinx高效的站内搜索引擎搭建详释

PHP+Mysql+Sphinx高效的站内搜索引擎搭建详释

PHP+Mysql+Sphinx高效的站内搜索引擎搭建详释●为什么要使用Sphinx假设你现在运营着一个论坛,论坛数据已经超过100W,很多用户都反映论坛搜索的速度非常慢,那么这时你就可以考虑使用Sphinx了(当然其他的全文检索程序或方法也行)。

●Sphinx是什么Sphinx由俄罗斯人Andrew Aksyonoff 开发的高性能全文搜索软件包,在GPL与商业协议双许可协议下发行。

全文检索是指以文档的全部文本信息作为检索对象的一种信息检索技术。

检索的对象有可能是文章的标题,也有可能是文章的作者,也有可能是文章摘要或内容。

●Sphinx的特性高速索引(在新款CPU上,近10 MB/秒);高速搜索(2-4G的文本量中平均查询速度不到0.1秒);高可用性(单CPU上最大可支持100 GB的文本,100M文档); 提供良好的相关性排名;支持分布式搜索; 提供文档摘要生成; 提供从MySQL内部的插件式存储引擎上搜索; 支持布尔,短语, 和近义词查询; 支持每个文档多个全文检索域(默认最大32个); 支持每个文档多属性; 支持断词; 支持单字节编码与UTF-8编码;●下载并安装Sphinx打开网址/news/7/52/ 找到适合自己的操作系统的版本,比如我是Windows 那么我就可以下载Coreseek Win32通用版本,Linux下可以下载源码包,自己编译安装。

这里解释下为什么我们下载的程序叫Coreseek,Coreseek是基于Sphinx开发的一款软件,对Sphinx做了一些改动,在中文方面支持得比Sphinx好,所以我们使用之。

下载完成后,将程序解压到你想解压的地方,比如我就想解压到E盘根目录,之后修改目录名为Coreseek,大功告成Coreseek安装完成了,安装的目录是在E:\coreseek\。

●使用Sphinx我要使用Sphinx需要做以下几件事1)首先得有数据2)建立Sphinx配置文件3)生成索引4)启动Sphinx5)使用之(调用api或search.exe程序进行查询)第1步:(导入数据)我们建立测试所需要用到得数据库、表以及数据,篇幅有限,这些在附件中都有,下载后导入MySQL即可。

Sphinx 全文搜索引擎

Sphinx 全文搜索引擎

Sphinx 全文搜索引擎1:索引与全文索引的概念数据库中,表中的行特别多,如何快速的查询某一行,或者某一个文章中的单词,索引--->查询速度快全文索引-->针对文章内容中的单词各做索引2:mysql支不支持全文索引?答:支持, 但是A:innoDB引擎在5.5,及之前的版本不支持(5.7实测可以在innodb上建fulltext),只能在myisam 引擎上用fulltextB: mysql的全文索引功能不够强大C: 无法对中文进行合理的全文索引----- mysql.无法进行中文分词.注意:全文索引的停止词停止词是指出现频率极高的单词, 不予索引.如果某单词出现频率50%以上,列为停止词或者是经过统计的常用词,也列为停止词---如is, are , she, he, this 等等就像中文中: “的”,”是”,”呵呵”总结: 我们要对中文做全文搜索引擎,需要解决2个问题1: 性能提高,用第3方的全文搜索引擎工具,如sphinx, solr等2: 中文分词! (如mmseg)编译安装sphinx+mmseg == coreseek官网: 0: 安装工具包yum install make gcc gcc-c++ libtool autoconf automake imake libxml2-devel expat-devel1: 下载解压源码,ls查看csft-4.1 mmseg-3.2.14 README.txt testpack其中--csft-4.1是修改适应了中文环境后的sphinxMmseg 是中文分词插件Testpack是测试用的软件包2: 先安装mmseg2.1: cd mmseg2.2: 执行bootstrap脚本2.3: ./configure --prefix=/usr/local/mmseg2.4: make && make install3: 再安装sphinx(coreseek)3.1: 到其目录下执行buildconf.sh3.2: ./configure --prefix=/usr/local/sphinx--with-mysql=/usr/local/mysql--with-mmseg--with-mmseg-includes=/usr/local/mmseg/include/mmseg/--with-mmseg-libs=/usr/local/mmseg/lib/3.3: make installSphinx的使用分三个部分:1: 数据源---要让sphinx知道,查哪些数据,即针对哪些数据做索引(可以定义多个源)2: 索引配置--针对哪个源做索引, 索引文件放在哪个目录?? 等等3: 搜索服务器----sphinx可以在某个端口(默认9312),以其自身的协议,与外部程序做交互.具体的步骤:1: 数据源典型配置source test {type = mysqlsql_host = localhostsql_user = rootsql_pass =sql_db = testsql_query_pre = set names utf8sql_query_pre = set session query_cache_type=offsql_query = select id,catid,pubtime,title,content from newssql_attr_uint = idsql_attr_uint = catidsql_attr_timestamp = pubtimesql_query_info = select * from news where id=$id}2: 索引典型配置index test {type = plainsource = testpath = /usr/local/sphinx/var/data/test #生成索引放在哪docinfo = externcharset_dictpath = /usr/local/mmseg/etc/charset_type = zh_cn.utf-8}2.1: 生成索引文件/path/sphinx/bin/indexer -c ./etc/sphinx.test.conf test (test是索引名)2.2: 查询测试A:在命令下,用path/bin/search -c ./path/conf 关键词B:开启搜索服务器,利用客户端连接搜索服务器来查询,见下3: 配置搜索服务器接口,启动搜索服务器searchd {listen = localhost:9312pid_file = /usr/local/sphinx/var/log/searchd.pidlog = /usr/local/sphinx/var/log/test.logquery_log =/usr/local/sphinx/var/log/test.query.logclient_timeout = 5max_children = 5max_matches = 1000seamless_rotate = 1}3.2 : 使用客户端连接搜索服务器1)系统testpack包里带的sphinxapi.php2)编译php的sphinx扩展1: 官方搜索下载sphinx扩展的压缩包并解压(假设解析在/usr/local/src/sphinx) 2: /path/php/bin/phpize 执行3: configure --with-php-config=/xxx/path/php/bin/php-config出错: e rror: Cannot find libsphinxclient headers错误原因: 没有预告编译libsphinxclient4: 解决3中的错误cd /usr/local/src/sphinx/api/libsphixclient/目录下# sh buildconf.sh# ./configure# make && make install5: 编译php的sphinx.so扩展# cd /path/to/sphinx1.3.0/#./configure --with-php-config=/usr/local/php/bin/php-config --with-sphinx# make && make install6: 编辑php.ini,把sphinx.so扩展引入并重启apache, 如果是php-fpm方式运行,则重启php-fpm进程查询分3部分1: 查询2: 过滤3: 排序1.1: 查询的模式查询的模式直接影响查询结果,SPH_MA TCH_ALL, 匹配所有查询词(默认模式);SPH_MA TCH_ANY, 匹配查询词中的任意一个;SPH_MA TCH_PHRASE, 将整个查询看作一个词组,要求按顺序完整匹配;SPH_MA TCH_BOOLEAN, 将查询看作一个布尔表达式SPH_MA TCH_ALL->Query(‘西瓜南瓜’) // 文档中有西瓜并且有南瓜才被选中SPH_MA TCH_ANY //->Query(‘西瓜南瓜’) // 文档中有西瓜或有南瓜被选中S PH_MA TCH_PHRASE // 严格理解为两词连续如内容”西瓜南瓜东瓜”->Query(‘西瓜南瓜’), 可以命中->Query(‘西瓜东瓜’), 不能命中, 因为西瓜东瓜两词不连续如果你觉得切换模式麻烦,可用BOOLEAN模式SPH_MA TCH_BOOLAN / /这个模式,能达到上3个模式的效果,需要在查询词之间做表达式如words1 & words2 则等同SPH_MA TCH_ALLWords1 | words2 则,等同SPH_MA TCH_ANYWords1 << word2 则是word1,word2都要有,且words1出现在word2前面1.2: 按字段查询如:要求只查content字段中的”西瓜”关键词“西瓜”====>”@content 西瓜”注意: 按字段查询需要把查询模式设置成”SPH_MA TCH_EXTNEDED”2 按属性过滤SetIDRange($min,$max); // 按id的范围过滤SetFilter($attr,$values=array(),$exclue=false); //SetFilterRange ( $attribute, $min, $max, $exclude=false )SetFilterFloatRange (设置浮点数范围)SetLimits($offset,$limits) //设置偏移量及取出条目例:->SetIDRange(2,3);->SetLimits(2,2); 取第3-4条->SetFilter(‘catid’,array(3,4),false) ; 以catid in (3,4) 为条件进行过滤->SetFilter(‘catid’,array(3,4),true) ; 以catid not in (3,4) 为条件,进行过滤注意:如果setLimits中碰到”per-query max_matches=0 out of bounds (per-server max_matches=1000)”错误,可以通过给setLimits指定第3个参数为大于0的整数,来解决.3: 按属性或权重排序排序模式:SPH_SORT_RELEV ANCE 模式, 按相关度降序排列(最好的匹配排在最前面)SPH_SORT_ATTR_DESC 模式, 按属性降序排列(属性值越大的越是排在前面)SPH_SORT_ATTR_ASC 模式, 按属性升序排列(属性值越小的越是排在前面)SPH_SORT_TIME_SEGMENTS 模式, 先按时间段(最近一小时/天/周/月)降序,再按相关度降序SPH_SORT_EXTENDED 模式, 按一种类似SQL的方式将列组合起来,升序或降序排列。

使用MySQL进行全文搜索的方法及工具推荐

使用MySQL进行全文搜索的方法及工具推荐

使用MySQL进行全文搜索的方法及工具推荐引言:数据发展的快速增长以及信息化的需求使得全文搜索变得越来越重要。

全文搜索是指通过检索文本内容,从中找出符合用户查询条件的相关的信息。

在数据库领域,MySQL作为一种常见的关系型数据库,也提供了全文搜索的功能。

本文将介绍使用MySQL进行全文搜索的方法,并推荐一些相关的工具。

一、MySQL全文搜索的基本原理MySQL的全文搜索基于InnoDB存储引擎提供的全文索引功能。

它使用倒排索引技术,将要搜索的文本按照单词进行分割,并建立索引。

用户可以通过MATCH() AGAINST()语句进行全文搜索操作。

1. 创建全文索引在MySQL中,要使用全文搜索功能,需要将文本字段添加全文检索索引。

可以采用两种方式:自然语言模式和布尔模式。

自然语言模式:CREATE FULLTEXT INDEX index_name ON table_name (column_name);布尔模式:CREATE FULLTEXT INDEX index_name ON table_name (column_name) WITH PARSER ngram;2. 使用MATCH() AGAINST()语句进行全文搜索MATCH()函数用于指定要搜索的字段,AGAINST()函数用于指定搜索关键词。

可以使用布尔运算符AND、OR和NOT进行组合查询。

SELECT * FROM table_name WHERE MATCH(column_name)AGAINST('keyword');二、MySQL全文搜索的工具除了MySQL自身提供的全文搜索功能,还有一些第三方工具可以增强MySQL的全文搜索能力。

下面推荐几个常用的工具。

1. ElasticsearchElasticsearch是一个基于Lucene的全文搜索引擎。

它具备分布式搜索、实时搜索、高可靠性等特点,可以快速地处理大规模的数据。

基于Sphinx构建准实时更新的分布式通用搜索引擎平台

基于Sphinx构建准实时更新的分布式通用搜索引擎平台

基于Sphinx构建准实时更新的分布式通用搜索引擎平台标签:搜索引擎、分布式、Sphinx、MySQL、并发前言:有不少网友希望阅读全文,我将该文档整理了一下,分享出来。

文档解压后大小为7.33M,共19页。

已经指出:一是MySQL本身的并发能力有限,在200~300个并发连接下,查询和更新就比较慢了;二是由于MySQL表的主键与Sphinx索引的ID一一对应,从而无法跨多表建立整站查询,而且新增加类别还得修改配置文件,比较麻烦;三是因为和MySQL集成,无法发挥出Sphinx的优势。

虽然如此,但对于一些写入量不大的搜索应用,已经足够了,或许对很多人会有帮助。

正文:索引擎平台,已经在生产环境运行9个月以上,经过运营中的不断完善与改进,目前已形成了一套可扩展的分布式通用站内搜索引擎框架。

CMS、视频、论坛等产品发生的增、删、改操作,文本内容实时写入自API查询接口,支持亿级数据的索引、分布式、中文分词、高亮显示、自动摘要、准实时(1分钟内)增量索引更新。

下面是Sphinx新的搜索架构中技术关键点实现方式的一些介绍,与大家分享、交流一下:1、一元分词和中文分词的结合:①、一元分词位于索引更新模块。

Sphinx索引引擎对于CJK(中日韩)语言(必须是UTF-8编码)支持一元切分,假设【反恐行动是国产主视角射击网络游戏】这段文字,Sphinx会将其切成【反恐行动是国产主视角射击网络游戏】,然后对每个字建立反向索引。

如果用这句话中包含的字组成一个不存在的词语,例如【恐动】,也会被搜索到,所以搜索时,需要加引号,例如搜索【"反恐行动"】,就能完全匹配连在一起的四个字,不连续的【"恐动"】就不会被搜索到。

但是,这样还有一个问题,搜索【"反恐行动游戏"】或【"国产网络游戏"】就会搜索不到。

对于这个问题,采用位于搜索查询模块的中文分词来处理。

搭建Sphinx+MySQL5.1x+SphinxSE+mmseg中文分词搜索引擎架构

搭建Sphinx+MySQL5.1x+SphinxSE+mmseg中文分词搜索引擎架构

Sphinx+MySQL5.1x+SphinxSE+mmseg中文分词搜索引擎架构搭建手记研究了一下sphinx,发现真是个好东西,先来几句废话,什么是SphinxSphinx 是一个在GPLv2 下发布的一个全文检索引擎,一般而言,Sphinx是一个独立的搜索引擎,意图为其他应用提供高速、低空间占用、高结果相关度的全文搜索功能。

Sphinx可以非常容易的与SQL数据库和脚本语言集成。

当前系统内置MySQL和PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式的XML数据。

通过修改源代码,用户可以自行增加新的数据源(例如:其他类型的DBMS的原生支持)。

Sphinx的特性高速的建立索引(在当代CPU上,峰值性能可达到10 MB/秒);高性能的搜索(在2 – 4GB 的文本数据上,平均每次检索响应时间小于0.1秒);可处理海量数据(目前已知可以处理超过100 GB的文本数据, 在单一CPU的系统上可处理100 M 文档);提供了优秀的相关度算法,基于短语相似度和统计(BM25)的复合Ranking方法; 支持分布式搜索;provides document exceprts generation;可作为MySQL的存储引擎提供搜索服务;支持布尔、短语、词语相似度等多种检索模式;文档支持多个全文检索字段(最大不超过32个);文档支持多个额外的属性信息(例如:分组信息,时间戳等);停止词查询;支持单一字节编码和UTF-8编码;原生的MySQL支持(同时支持MyISAM 和InnoDB );原生的PostgreSQL 支持.更多特性参考手册。

原生MySQL存储引擎检索流程:基于Sphinx存储引擎检索:开始本文以CentOS5.5+mysql-5.1.55+sphinx-0.9.9(coreseek-3.2.14.tar.gz)为例介绍Sphinx+MySQL5.1x+SphinxSE存储引擎+mmseg中文分词搜索引擎架构搭建过程。

基于Sphinx构建Web站内全文搜索系统的研究的开题报告

基于Sphinx构建Web站内全文搜索系统的研究的开题报告

基于Sphinx构建Web站内全文搜索系统的研究的开题报告一、研究背景与意义随着互联网内容的爆炸式增长,网站上的信息海量化已成为常态。

如何快速、准确地检索所需的信息,成为了用户的重要需求。

然而,大部分网站的搜索功能存在以下几个问题:1. 搜索结果不准确或不完整,无法满足用户需求;2. 搜索速度慢,甚至出现500等错误,让用户无法使用;3. 不支持搜索指定类型的文件,如PDF、Word文档等;4. 不支持中文全文搜索,存在乱码等问题。

为了解决这些问题,建设一个高效、准确、全面的Web站内全文搜索系统变得愈加必要。

Sphinx是一种全文搜索引擎。

它采用高效的索引和查询算法,支持快速、准确地搜索大量关键词和文本。

与其他搜索引擎相比,Sphinx有如下优势:1. 支持分布式架构,可以横向扩展;2. 网站访问量大时,Sphinx能够快速响应;3. 支持多语言搜索,并且中文搜索支持良好;4. 可以针对不同类型的文件进行全文搜索;5. 支持多种查询方式,满足不同的搜索需求。

因此,本研究旨在探究基于Sphinx构建Web站内全文搜索系统的实现方式及其优化方法,以提高网站搜索的效率和准确性。

二、研究目标与方法本研究的主要目标是:1. 研究Sphinx搜索引擎的技术原理;2. 学习Web站内全文搜索系统的开发方法;3. 建立基于Sphinx的搜索引擎,并与网站进行集成;4. 对Sphinx搜索引擎进行优化,提高搜索效率和准确性。

本研究的方法为:1. 研究相关文献,了解Sphinx搜索引擎的基本原理、应用场景和优劣势;2. 设计Web站内全文搜索系统的系统架构、关键技术和接口规范;3. 根据系统设计,使用Python编写基于Sphinx的搜索引擎,并进行调试和测试;4. 针对搜索效率和准确性等方面进行优化,包括索引优化、查询优化、分布式架构优化等等;5. 与网站进行集成测试,在实际环境中验证搜索功能和性能。

三、预期成果与意义本研究的预期成果为:1. 建立一个基于Sphinx的Web站内全文搜索系统,实现搜索速度快、准确度高和支持多种文件格式的搜索;2. 完成Sphinx搜索引擎的优化工作,提高搜索效率和准确性;3. 提供搜索系统的使用文档和测试报告。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

[文章作者:张宴本文版本:v1.0 最后修改:2008.07.27 转载请注明原文链接:/post/360/]
前言:本文阐述的是一款经过生产环境检验的千万级数据全文检索(搜索引擎)架构。

本文只列出前几章的内容节选,不提供全文内容。

在DELL PowerEdge 6850服务器(四颗64 位Inter Xeon MP 7110N处理器/ 8GB内存)、RedHat AS4 Linux操作系统、MySQL 5.1.26、MyISAM存储引擎、key_buffer=1024M环境下实测,单表1000万条记录的数据量(这张MySQL表拥有int、datetime、varchar、text等类型的10多个字段,只有主键,无其它索引),用主键(PRIMARY KEY)作为WHERE条件进行SQL查询,速度非常之快,只耗费0.01秒。

出自俄罗斯的开源全文搜索引擎软件Sphinx,单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。

Sphinx创建索引的速度为:创建100万条记录的索引只需3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。

基于以上几点,我设计出了这套搜索引擎架构。

在生产环境运行了一周,效果非常不错。

有时间我会专为配合Sphinx搜索引擎,开发一个逻辑简单、速度快、占用内存低、非表锁的MySQL存储引擎插件,用来代替MyISAM引擎,以解决MyISAM存储引擎在频繁更新操作时的锁表延迟问题。

另外,分布式搜索技术上已无任何问题。

一、搜索引擎架构设计:
1、搜索引擎架构图:
2、搜索引擎架构设计思路:
(1)、调用方式最简化:
尽量方便前端Web工程师,只需要一条简单的SQL语句“SELECT ... FROM myisam_table JOIN sphinx_table ON (sphinx_table.sphinx_id=myisam_table.id) WHERE query='...';”即可实现高效搜索。

(2)、创建索引、查询速度快:
①、Sphinx Search 是由俄罗斯人Andrew Aksyonoff 开发的高性能全文搜索软件包,在GPL与商业协议双许可协议下发行。

Sphinx的特征:
•Sphinx支持高速建立索引(可达10MB/秒,而Lucene建立索引的速度是1.8MB/秒)•高性能搜索(在2-4 GB的文本上搜索,平均0.1秒内获得结果)
•高扩展性(实测最高可对100GB的文本建立索引,单一索引可包含1亿条记录)
•支持分布式检索
•支持基于短语和基于统计的复合结果排序机制
•支持任意数量的文件字段(数值属性或全文检索属性)
•支持不同的搜索模式(“完全匹配”,“短语匹配”和“任一匹配”)
•支持作为Mysql的存储引擎
②、通过国外《High Performance MySQL》专家组的测试可以看出,根据主键进行查询的类似“SELECT ... FROM ... WHERE id = ...”的SQL语句(其中id为PRIMARY KEY),每秒钟能够处理10000次以上的查询,而普通的SELECT查询每秒只能处理几十次到几百次:
③、Sphinx不负责文本字段的存储。

假设将数据库的id、date、title、body字段,用sphinx 建立搜索索引。

根据关键字、时间、类别、范围等信息查询一下sphinx,sphinx只会将查询结果的ID号等非文本信息告诉我们。

要显示title、body等信息,还需要根据此ID号去查询MySQL数据库,或者从Memcachedb等其他的存储中取得。

安装SphinxSE作为MySQL 的存储引擎,将MySQL与Sphinx结合起来,是一种便捷的方法。

创建一张Sphinx类型表,将MyISAM表的主键ID和Sphinx表的ID作一个JOIN联合查询。

这样,对于MyISAM表来所,只相当于一个WHERE id=...的主键查询,WHERE后的条件都交给Sphinx去处理,可以充分发挥两者的优势,实现高速搜索查询。

(3)、按服务类型进行分离:
为了保证数据的一致性,我在配置Sphinx读取索引源的MySQL数据库时,进行了锁表。

Sphinx读取索引源的过程会耗费一定时间,由于MyISAM存储引擎的读锁和写锁是互斥的,为了避免写操作被长时间阻塞,导致数据库同步落后跟不上,我将提供“搜索查询服务”的和提供“索引源服务”的MySQL数据库进行了分开。

监听3306端口的MySQL提供“搜索查询服务”,监听3406端口的MySQL提供“索引源服务”。

(4)、“主索引+增量索引”更新方式:
一般网站的特征:信息发布较为频繁;刚发布完的信息被编辑、修改的可能性大;两天以前的老帖变动性较小。

基于这个特征,我设计了Sphinx主索引和增量索引。

对于前天17:00之前的记录建立主索引,每天凌晨自动重建一次主索引;对于前天17:00之后到当前最新的记录,间隔3分钟自动重建一次增量索引。

(5)、“Ext3文件系统+tmpfs内存文件系统”相结合:
为了避免每3分钟重建增量索引导致磁盘IO较重,从而引起系统负载上升,我将主索
引文件创建在磁盘,增量索引文件创建在tmpfs内存文件系统“/dev/shm/”内。

“/dev/shm/”内的文件全部驻留在内存中,读写速度非常快。

但是,重启服务器会导致“/dev/shm/”内的文件丢失,针对这个问题,我会在服务器开机时自动创建“/dev/shm/”内目录结构和Sphinx增量索引。

(6)、中文分词词库:
我根据“自整理的中文分词库”+“搜狗拼音输入法细胞词库”+“LibMMSeg高频字库”+... 综合整理成一份中文分词词库,出于某些考虑暂不提供。

你可以使用LibMMSeg自带的中文分词词库。

二、MySQL+Sphinx+SphinxSE安装步骤:
1、安装python支持(以下针对CentOS系统,其他Linux系统请使用相应的方法安装)yum install -y python python-devel
2、编译安装LibMMSeg(LibMMSeg是为Sphinx全文搜索引擎设计的中文分词软件包,其在GPL协议下发行的中文分词法,采用Chih-Hao Tsai的MMSEG算法。

LibMMSeg在本文中用来生成中文分词词库。


以下压缩包“sphinx-0.9.8-rc2-chinese.zip”中包含mmseg-0.7.3.tar.gz、sphinx-0.9.8-rc2.tar.gz以及中文分词补丁。

下载文件
点击这里下载文件
unzip sphinx-0.9.8-rc2-chinese.zip
tar zxvf mmseg-0.7.3.tar.gz
cd mmseg-0.7.3/
./configure
make
make install
cd ../
3、编译安装MySQL 5.1.26-rc、Sphinx、SphinxSE存储引擎
wget
/get/Downloads/MySQL-5.1/mysql-5.1.26-rc.tar.gz/from/http://mirror.x10. com/mirror/mysql/
tar zxvf mysql-5.1.26-rc.tar.gz
tar zxvf sphinx-0.9.8-rc2.tar.gz
cd sphinx-0.9.8-rc2/
patch -p1 < ../sphinx-0.98rc2.zhcn-support.patch
patch -p1 < ../fix-crash-in-excerpts.patch
cp -rf mysqlse ../mysql-5.1.26-rc/storage/sphinx
cd ../
cd mysql-5.1.26-rc/
sh BUILD/autorun.sh
./configure --with-plugins=sphinx --prefix=/usr/local/mysql-search/ --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile
make && make install
cd ../
cd sphinx-0.9.8-rc2/
CPPFLAGS=-I/usr/include/python2.4
LDFLAGS=-lpython2.4
./configure --prefix=/usr/local/sphinx --with-mysql=/usr/local/mysql-search
make
make install
cd ../
mv /usr/local/sphinx/etc/sphinx.conf /usr/local/sphinx/etc/sphinx.conf.old
第二章第3节之后的正文内容不予公布,全文的目录如下(共24页):。

相关文档
最新文档