Chinaunix首页 | 论坛 | 博客
  • 博客访问: 218865
  • 博文数量: 49
  • 博客积分: 1532
  • 博客等级: 上尉
  • 技术积分: 352
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-17 13:37
个人简介

..................................

文章分类

全部博文(49)

文章存档

2023年(1)

2020年(2)

2019年(2)

2018年(17)

2017年(15)

2016年(12)

分类: Mysql/postgreSQL

2016-11-05 10:51:23

[导读] 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 中文分词

mysql-5.1.26-rc.tar.gz mysql-5.1.26源代码
sphinx-0.9.8-rc2.tar.gz sphinx-0.9.8-rc2源代码
[c-sharp] view plaincopy
mmseg   
Coreseek COS(tm) MM Segment 1.0   
Copyright By Coreseek.com All Right Reserved.   
Usage: mmseg     
-u            Unigram Dictionary   
-r           Combine with -u, used a plain text build Unigram Dictionary, default Off   
-b            Synonyms Dictionary   
-h            print this help and exit


fix-crash-in-excerpts.patch sphinx支持分词补丁


sphinx-0.98rc2.zhcn-support.patch sphinx支持分词补丁


二、开始安装

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的配置等信息你可以请参考:


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 
#   
# 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
阅读(2748) | 评论(0) | 转发(0) |
0

上一篇:linux 添加swap

下一篇:Linux下高cpu解决方案

给主人留下些什么吧!~~