MySQL+Sphinx实现全文搜索
最近在做一个搜索引擎,主要是对图书方面的对象级的搜索,首先来了解下Sphinx吧。
它能够提高你的查询的速度,这个不是一般的快。
Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,他可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。 Sphinx特别为一些脚本语言设计搜索API接口,如:PHP、Python、Perl、Ruby等,同时为MySQL也设计了一个存储引擎插件。
Sphinx单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为毫秒级。Sphinx创建索引的速度为:创建100万条记录的索引只需 3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。
Sphinx的主要特性包括:
高速索引 (在新款CPU上,近10 MB/秒);
高速搜索 (2-4G的文本量中平均查询速度不到0.1秒);
高可用性 (单CPU上最大可支持100 GB的文本,100M文档);
提供良好的相关性排名
支持分布式搜索;
提供文档摘要生成;
提供从MySQL内部的插件式存储引擎上搜索
支持布尔,短语, 和近义词查询;
支持每个文档多个全文检索域(默认最大32个);
支持每个文档多属性;
支持断词;
支持单字节编码与UTF-8编码;
看了上面的特点还是挺不错的,在看看使用的方式吧.
原生MySQl存储引擎检索流程:
基于Sphinx存储引擎检索:
我还是比较喜欢使用第二种存储引擎,即使你的编程语言不支持Sphinx的API的接口也可以使用哟。
在开始安装之前需要安装一些必要的组件
yum -y install gcc g++ gcc-c++ libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers patch libtool automake imake mysql-devel expat-devel |
(1)安装python支持
yum install –y python python-devel |
(2)编译安装LibMMSeg(LibMMSeg是为Sphinx全文搜索引擎设计的中文分词软件包,其在GPL协议下发行的中文分词法,采用Chin-Hao Tsai的MMSEG算法。LibMMSeg在本文中用来生成中文分词词库)。
wget http://www.coreseek.com/uploads/sources/mmseg-0.7.3.tar.gz tar zxvf mmseg-0.7.3.tar.gz cd mmseg-0.7.3 ./configure make make install |
(1) 编译安装MySQL5.1.26-rc、Sphinx、SphinxSE存储引擎
wget http://blog.s135.com/soft/linux/nginx_php/mysql/mysql-5.1.26-rc.tar.gz tar zxvf mysql-5.1.26-rc.tar.gz wget http://www.sphinxsearch.com/downloads/sphinx-0.9.8-rc2.tar.gz wget http://www.coreseek.com/uploads/sources/sphinx-0.98rc2.zhcn-support.patch wget http://www.coreseek.com/uploads/sources/fix-crash-in-excerpts.patch tar zxvf sphinx-0.9.8.rc2.tar.gz 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= partition,innobase,myisammrg,sphinx --prefix=/usr/local/mysql / --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 ../ |
启动MySQL数据库
cp support-files/my-medium.cnf /etc/my.cnf # 配置文件 cp support-files/mysql.server /etc/rc.d/mysqld # 添加 MySQL 服务控制 cd /usr/local/mysql bin/mysql_install_db --user=mysql # 安装 bin/mysqld_safe --user=mysql & # 测试安装是否成功 bin/mysql # 进入 MySQL 命令提示符 启动停止 /etc/rc.d/mysqld start /etc/rc.d/mysqld stop 于是我们自己创建文件/etc/rc.local并给予执行权限。大致内容为: #!/bin/sh /usr/local/mysql/bin/mysqld_safe --user=mysql & 或者 /etc/rc.d/mysqld start |
输入下列命令出现SPHINX表示SphinxSE已经移植到MySQL中去了。
show engines; |
本文使用的0.9.8版本,建议使用0.9.9版本,0.9.9版本是最稳当的版本,我最后也改成了0.9.9版本的。
Sphinx默认不支持中文索引及检索,以前用Coreseek的补丁来解决,目前Coreseek不单独提供补丁,而基于Sphinx开发了Coreseek全文检索服务器,Coreseek应该是现在用的最多的Sphinx中文全文检索,它提供了为Sphinx设计的中文分词包LibMMSeg包含mmseg中文分词,其实coreseek-3.2.14.tar.gz中已经包含了sphinx,前面安装SphinxSE时也可以使用这个压缩包里的mysqlse。
安装autoconf
tar zxvf autoconf-2.64.tar.gz cd autoconf-2.64 ./configure –prefix=/usr make make install |
安装Coreseek
tar zxvf coreseek-3.2.14.tar.gz cd coreseek-3.2.14 cd mmseg-3.2.14/ ./bootstrap ./configure –prefix=/usr/local/mmseg3 make make install cd ../csft-3.2.14/ sh buildconf.sh ./configure --prefix=/usr/local/coreseek --without-python --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql --host=arm make make install cd /usr/local/coreseek/etc |
进入配置目录通过命令ls可以看到3个文件
example.sql sphinx.conf.dist sphinx-min.conf.dist
其中example.sql是实例sql脚本我们将其导入到数据库中的test数据库中作为测试数据(会创建documents表和tags表)
vi sphinx.conf
输入一些内容:
source src1 { type = mysql sql_host = localhost sql_user = root sql_pass =12345678 sql_db = test sql_port = 3306 # optional, default is 3306 sql_sock = /tmp/mysql.sock sql_query_pre = SET NAMES utf8 sql_query = \ SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \ FROM documents sql_attr_uint = group_id sql_attr_timestamp = date_added sql_query_info = SELECT * FROM documents WHERE id=$id } index test1 { source = src1 path = /usr/local/coreseek/var/data/test1 docinfo = extern charset_type = zh_cn.utf-8 mlock = 0 morphology = none min_word_len = 1 html_strip = 0 charset_dictpath = /usr/local/mmseg3/etc/ ngram_len = 0 } indexer { mem_limit = 32M } searchd { port = 9312 log = /usr/local/coreseek/var/log/searchd.log query_log = /usr/local/coreseek/var/log/query.log read_timeout = 5 max_children = 30 pid_file = /usr/local/coreseek/var/log/searchd.pid max_matches = 1000 seamless_rotate = 1 preopen_indexes = 0 unlink_old = 1 } |
说明:代码段sorce src1{***}代表数据源里面主要包含了数据库的配置信息,src1表示数据源名字,可以随便写。
代码段index test1{***} 代表为那个数据源创建索引,与source ***是成对出现的,其中的source参数的值必须是某个数据源的名字。
生成索引
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf --all |
出现的问题:
问题1:如果sh BUILD/autorun.sh
但sphinx就是不会出现在configure –h里面,需要执行sh BUILD/cleanup 再执行sh BUILD/autorun.sh 然后执行./configure –h现在就可以看到sphinx了。
问题2:如果编译mysql是报错查看是否安装ncurses安装包
可以执行:yum list|grep ncurses
yum –y install ncurses-devel
yum install ncurses-devel
然后再执行./configure。
问题3 在安装LibMMSeg需要先执行yum install mysql-devel libxml2-devel expat-devel
问题4 在安装MMSeg的时候出现错误提示为:css/UnigramCorpusReader.cpp:89: error: 'strncmp' was not declared in this scope
手动修改了src/css/UnigramCorpusReader.cpp
在上面添加了一句
#include <string.h>
然后再开始编译安装就可以了。
MySQL+Sphinx实现全文搜索的更多相关文章
- mac 下 sphinx + mysql + php 实现全文搜索(xampp)(3)sphinx 的配置项解析
source:数据的来源,数据是从什么地方来的. index:索引,当有数据源之后,从数据源处构建索引.索引实际上就是相当于一个字典检索.有了整本字典内容以后,才会有字典检索. searchd:提供搜 ...
- mac 下 sphinx + mysql + php 实现全文搜索(xampp)(1)
原理: 使用sphinx 中的indexer 生成索引数据 service/web 端 利用searched 调用索引数据 步骤: 下载 sphinx: 下载地址:http://sphinxsea ...
- mac 下 sphinx + mysql + php 实现全文搜索(xampp)(4)php api 解析
1:function GetLastError() // 假如报错的话,会输出报错信息 2:function GetLastWarning ()// 输出 警告信息 3:function SetSe ...
- [转]Sphinx+Mysql+中文分词安装-实现中文全文搜索
From : http://blog.csdn.net/lgm252008/article/details/5373436 1.什么是SphinxSphinx 是一个在GPLv2 下发布的一个全文检索 ...
- mysql 全文搜索(转载http://blog.csdn.net/manbujingxin/article/details/6656992)
前提:mysql只支持英文内容的全文索引,所以只考虑英文的全文搜索.假定数据表名为post,有三列:id.title.content.id是自增长序号,title是varchar,content是te ...
- php+中文分词scws+sphinx+mysql打造千万级数据全文搜索
转载自:http://blog.csdn.net/nuli888/article/details/51892776 Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎.意图 ...
- MySQL 全文搜索支持, mysql 5.6.4支持Innodb的全文检索和类memcache的nosql支持
背景:搞个个人博客的全文搜索得用like啥的,现在mysql版本号已经大于5.6.4了也就支持了innodb的全文搜索了,刚查了下目前版本号都到MySQL Community Server 5.6.1 ...
- MySQL 全文搜索支持
MySQL 全文搜索支持 从MySQL 4.0以上 myisam引擎就支持了full text search 全文搜索,在一般的小网站或者blog上可以使用这个特性支持搜索. 那么怎么使用了,简单看看 ...
- ubuntu上 安装 基于sphinx 的 coreseek 全文搜索
原生sphinx不支持中文, sphinx-for-chinese匹配中文时也不返回结果 ,真纠结, 最好试了 coreseek,这个能正确返回结果了, 所以记录一下 1 http://www.co ...
随机推荐
- ios7 UITableView 分割线在 使用selectedBackgroundView 选中时有些不显示
UITableView 选中cell ,默认会有一个灰色的背景遮罩效果,这个灰色遮罩就是cell 自带的 selectedBackgroundView 我们可以设置selectedBackgroun ...
- windbg----as、$u0(固定别名、自定义别名)
固定别名($u0~$u9) 有10个固定别名.他们是$u0, $u1, ..., $u9.他们的等价字符串可以是不包含ENTER键的任意字符串.使用r (Registers)命令为固定别明指定等价字符 ...
- 命令行的全文搜索工具--ack
想必大家在命令行环境下工作时候,一定有想要查找当前目录下的源代码文件中的某些字符的需求,这时候如果使用传统方案,你可能需要输入一长串的命令,比如这样: 1. grep -R 'string' dir/ ...
- 20个最漂亮的基于WordPress的企业网站
20个最漂亮的基于WordPress的企业网站 每个人都知道很好很强大的WordPress是开源的,并且有一个很强的的团队和更强大的支持社区.它被世界上的广大设计师.程序员和商业人员广泛使用.它已经成 ...
- 菜鸟调错(八)—— Maven编译错误:不兼容的类型的解决方案
泛型在实际的工作中应用非常广泛,关于泛型就不在这里赘述了,感兴趣请戳<重新认识泛型>.项目中用到了如下的泛型: public <T> T query(String sql, R ...
- 【终极解决方案】为应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。
困扰我大半年的错误,今天偶然间被解决了,特此分享给被同样问题纠结的朋友们! 之前的求助帖,无人应答: http://www.cnblogs.com/freeton/archive/2012/08/28 ...
- Flink 案例整合
1.概述 Flink 1.1.0 版本已经在官方发布了,官方博客于 2016-08-08 更新了 Flink 1.1.0 的变动.在这 Flink 版本的发布,添加了 SQL 语法这一特性.这对于业务 ...
- TDA - Thread Dump Analyzer (Java线程分析工具)
TDA - Thread Dump Analyzer (Java线程分析工具)http://automationqa.com/forum.php?mod=viewthread&tid=2351 ...
- glow
原则是: 先把原场景渲染到fbo,然后渲染发光的物体 然后叠加,但是问题来了,发光物体是另外一个fbo里渲染的,他没和原场景进行深度测试,导致全部绘制了,叠到一起的时候原先不该显示的部分显示 然后我立 ...
- 网上收集的以及自己总结的iOS开发技巧
Objective-C 1.让Xcode的控制台支持LLDB类型的打印 这有什么用? 怎么说尼,笔者认为这个还是比较有用滴,为什么有用尼? 因为在Xcode断点调试的时候, 在控制台输入 po sel ...