来源:未知 时间:2015-08-11 11:12 作者:xxadmin 阅读:次
[导读] 1、什么是Sphinx Sphinx 是一个在GPLv2 下发布的一个全文检索引擎,商业授权(例如, 嵌入到其他程序中) 需要联系我们(Sphinxsearch.com)以获得商业授权。 一般而言,Sphinx是一个独立的搜...
1、什么是Sphinx Sphinx 是一个在GPLv2 下发布的一个全文检索引擎,商业授权(例如, 嵌入到其他程序中) 需要联系我们(Sphinxsearch.com)以获得商业授权。 一般而言,Sphinx是一个独立的搜索引擎,意图为其他应用提供高速、低空间占用、高结果 相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和脚本语言集成。 当前系统内置MySQL和PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式 的XML数据。通过修改源代码,用户可以自行增加新的数据源(例如:其他类型的DBMS 的原生支持)。 搜索API支持PHP、Python、Perl、Rudy和Java,并且也可以用作MySQL存储引擎。搜索 API非常简单,可以在若干个小时之内移植到新的语言上。 Sphinx 是SQL Phrase Index的缩写,但不幸的和CMU的Sphinx项目重名 2、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 支持. 一、安装所需文件mmseg-0.7.3.tar.gz 中文分词 http://www.coreseek.com/uploads/sources/mmseg-0.7.3.tar.gz mysql-5.1.26-rc.tar.gz mysql-5.1.26源代码 sphinx-0.9.8-rc2.tar.gz sphinx-0.9.8-rc2源代码 http://www.sphinxsearch.com/downloads/sphinx-0.9.8-rc2.tar.gz [c-sharp] view plaincopy mmseg Coreseek COS(tm) MM Segment 1.0 Copyright By Coreseek.com All Right Reserved. Usage: mmseg <option> <file> -u <unidict> Unigram Dictionary -r Combine with -u, used a plain text build Unigram Dictionary, default Off -b <Synonyms> Synonyms Dictionary -h print this help and exit fix-crash-in-excerpts.patch sphinx支持分词补丁 http://www.coreseek.com/uploads/sources/fix-crash-in-excerpts.patch sphinx-0.98rc2.zhcn-support.patch sphinx支持分词补丁 http://www.coreseek.com/uploads/sources/sphinx-0.98rc2.zhcn-support.patch 二、开始安装 1.安装libmmseg 安装mmseg完成,测试一下 [c-sharp] view plaincopy tar -zxvf mmseg-0.7.3.tar.gz cd mmseg-0.7.3 ./configure --prefix=/usr/local/mmseg make make install cd .. 有问题可以尝试执行下面命令 [c-sharp] view plaincopy echo '/usr/local/mmseg/lib' >> /etc/ld.so.conf ldconfig -v ln -s /usr/local/mmseg/bin/mmseg /bin/mmseg 2.重新编译mysql 在安装之前先打两个补丁,这个是支持中文必须打的补丁 [c-sharp] view plaincopy tar -zxvf sphinx-0.9.8-rc2.tar.gz cd sphinx-0.9.8 patch -p1 < ../sphinx-0.98rc2.zhcn-support.patch patch -p1 < ../fix-crash-in-excerpts.patch
3.安装sphinx [c-sharp] view plaincopy cd /root/lemp/sphinx-0.9.8-rc2 ./configure --prefix=/usr/local/sphinx --with-mysql=/opt/mysql / --with-mysql-includes=/opt/mysql/include/mysql --with-mysql-libs=/opt/mysql/lib/mysql / --with-mmseg-includes=/usr/local/mmseg/include --with-mmseg-libs=/usr/local/mmseg/lib --with-mmseg make [c-sharp] view plaincopy tokenizer_zhcn.cpp:1:30: SegmenterManager.h: 没有那个文件或目录 tokenizer_zhcn.cpp:2:23: Segmenter.h: 没有那个文件或目录
[c-sharp] view plaincopy make clean ./configure --prefix=/usr/local/sphinx --with-mysql=/opt/mysql / --with-mysql-includes=/usr/local/mysql/include/mysql --with-mysql-libs=/opt/mysql/lib/mysql / --with-mmseg-includes=/usr/local/mmseg/include/mmseg --with-mmseg-libs=/usr/local/mmseg/lib --with-mmseg /root/sphinx/sphinx-0.9.8-rc2/src/tokenizer_zhcn.cpp:34: undefined reference to `libiconv_close' collect2: ld returned 1 exit status 官网解决办法: In the meantime I've change the configuration file and set #define USE_LIBICONV 0 in line 8179. 修改configure 文件把 #define USE_LIBICONV 0 最后的数值由1改为0 重新编译。 [c-sharp] view plaincopy make clean ./configure --prefix=/usr/local/sphinx --with-mysql=/opt/mysql / --with-mysql-includes=/usr/local/mysql/include/mysql --with-mysql-libs=/usr/local/mysql/lib/mysql / --with-mmseg-includes=/usr/local/mmseg/include/mmseg --with-mmseg-libs=/usr/local/mmseg/lib --with-mmseg vi configure 输入/define USE_LIBICONV 找到目标行 按i键后将1改成0,按esc,输入:wq保存退出 [c-sharp] view plaincopy make make install [c-sharp] view plaincopy cd /usr/local/sphinx/etc cp sphinx.conf.dist sphinx.conf 4.配置sphinx 修改/usr/local/sphinx/etc/sphinx.conf
[c-sharp] view plaincopy type = mysql # some straightforward parameters for SQL source types sql_host = localhost sql_user = root sql_pass = sql_db = test sql_port = 3306 # optional, default is 3306 address = 127.0.0.1 #安全点可以只监听本机
5.索引建立 装好sphinx后在sphinx的目录中有三个目录 分别为bin etc var bin中 存有sphinx用到的一些执行文件 包括 indexer 索引建立 search 查询工具 searchd 查询服务器 等 为了下面测试方便,我们先将sphinx.conf自带的example.sql脚本倒入的mysql中 //创建了一个test库,并建立了documents测试表和数据 [c-sharp] view plaincopy /usr/local/mysql/bin/mysql -uroot -p < /usr/local/sphinx/etc/example.sql
索引的建立方法为 [c-sharp] view plaincopy /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf test1
test1为资源名称 不写为默认所有都建立索引 附: 建立索引期间可能由于不同版本的数据库导致indexer找不到共享库libmysqlclient.so.16 需要把/opt/mysql/lib/mysql/libmysqlclient.so.16.0.0 这个文件复制到/usr/lib下 或者作软连接即可 6.查询服务器 /usr/local/sphinx/bin/searchd --config /usr/local/sphinx/etc/sphinx.conf 为开启 /usr/local/sphinx/bin/searchd --config /usr/local/sphinx/etc/sphinx.conf --stop 为关闭 sphinx的查询 可以大致分为三种 1 数据库引擎中的查询 2 通过search工具查询 /usr/local/sphinx/bin/search --config /usr/local/sphinx/etc/sphinx.conf test 3 通过php的接口查询 详见sphinxapi.php 三、在mysql中的使用SphinxSE方式调用Sphinx 1.在mysql中的使用SphinxSE方式调用Sphinx 首先建立一张索引专用表: [c-sharp] view plaincopy CREATE TABLE `sphinx` ( `id` int(11) NOT NULL, `weight` int(11) NOT NULL, `query` varchar(255) NOT NULL, `CATALOGID` INT NOT NULL, `EDITUSERID` INT NOT NULL, `HITS` INT NULL, `ADDTIME` INT NOT NULL, KEY `Query` (`Query`) ) ENGINE=SPHINX DEFAULT CHARSET=utf8 CONNECTION='sphinx://localhost:3312/test1'
test1:索引的名称,可以在sphinx.conf中查找到 建立完索引专用表后,我们就可以在mysql中使用它了,例如,在mysql中输入 [c-sharp] view plaincopy SELECT doc. * FROM documents doc JOIN sphinx ON ( doc.id = sphinx.id ) WHERE query = 'doc;mode= any' 运行后,结果记录中将会显示包含doc字符串的所用记录行 关于query的语法,还有sphinx的配置等信息你可以请参考: http://www.sphinxsearch.com/doc.html 2.中文分词应用 生成词典 进入到mmseg的源代码目录后 [c-sharp] view plaincopy cd data mmseg -u unigram.txt 在data下边会产生一个文件unigram.txt.uni 这个就是生成的字典 然后把字典改名为uni.lib放在可以读取的目录中即可 [c-sharp] view plaincopy cp unigram.txt.uni /usr/local/sphinx/uni.lib
修改 sphinx.conf(/usr/local/sphinx/etc/sphinx.conf)配置文件 在索引中加入 [c-sharp] view plaincopy charset_type = zh_cn.utf-8 charset_dictpath = /usr/local/sphinx/ [c-sharp] view plaincopy INSERT INTO `test`.`documents` ( `id` , `group_id` , `group_id2` , `date_added` , `title` , `content` ) VALUES ( NULL , '3', '9', NOW( ) , 'sphinx中文搜索', 'Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。 ' ); (如果searchd已经再运行,先kill 它再运行) 注意:在添加完数据后,需要重新加载索引,这样新的数据才能被缓存进去 重建索引,成功后,开启索引监听 [c-sharp] view plaincopy /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf --all /usr/local/sphinx/bin/searchd --config /usr/local/sphinx/etc/sphinx.conf 在ide硬盘上建索引的速度 [c-sharp] view plaincopy indexing index 'test1'... collected 423228 docs, 637.2 MB sorted 125.5 Mhits, 100.0% done total 423228 docs, 637201412 bytes total 753.401 sec, 845766.13 bytes/sec, 561.76 docs/sec 这样,就可以在phpmyadmin中进行测试了。 [c-sharp] view plaincopy SELECT doc. * FROM documents doc JOIN sphinx ON ( doc.id = sphinx.id ) WHERE query = '设计;mode= any '
好像没出来。。。。 修改 sphinx.conf 去掉下面的注释 [c-sharp] view plaincopy sql_query_pre = SET NAMES utf8 再重启searchd就可以搜出结果了 使用service 控制sphinx 先增加一sphinx用户并属于website组(事先已存在),并修改sphinx目录的属主 [c-sharp] view plaincopy useradd -d /usr/local/sphinx -g website -s /sbin/nologin sphinx chown -R sphinx:website /usr/local/sphinx 创建/etc/init.d/sphinx脚本 [c-sharp] view plaincopy #!/bin/sh # sphinx: Startup script for Sphinx search # # chkconfig: 345 86 14 # description: This is a daemon for high performance full text / # search of MySQL and PostgreSQL databases. / # See http://www.sphinxsearch.com/ for more info. # # processname: searchd # pidfile: $sphinxlocation/var/log/searchd.pid # Source function library. . /etc/rc.d/init.d/functions processname=searchd servicename=sphinx username=sphinx sphinxlocation=/usr/local/sphinx pidfile=$sphinxlocation/var/log/searchd.pid searchd=$sphinxlocation/bin/searchd RETVAL=0 PATH=$PATH:$sphinxlocation/bin start() { echo -n $"Starting Sphinx daemon: " daemon --user=$username --check $servicename $processname RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$servicename } stop() { echo -n $"Stopping Sphinx daemon: " $searchd --stop #killproc -p $pidfile $servicename -TERM RETVAL=$? echo if [ $RETVAL -eq 0 ]; then rm -f /var/lock/subsys/$servicename rm -f $pidfile fi } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status $processname RETVAL=$? ;; restart) stop sleep 3 start ;; condrestart) if [ -f /var/lock/subsys/$servicename ]; then stop sleep 3 start fi ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart}" ;; esac exit $RETVAL 修改权限并加入到service,机器启动时自动启动 [c-sharp] view plaincopy chmod 755 /etc/init.d/sphinx chkconfig --add sphinx chkconfig --level 345 sphinx on chkconfig --list|grep sphinx #检查下 service sphinx start #运行 service sphinx stop #停止,官方的脚本在我的as4上有点问题,所以粗鲁的改了下 service sphinx restart #重启 service sphinx status #查看是否运行 #检查下已用sphinx用户运行 ps aux |grep searchd sphinx 24612 0.0 0.3 11376 6256 pts/1 S 14:07 0:00 searchd
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com