• 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>

    然后再开始编译安装就可以了。

    转载自:http://www.cnblogs.com/sunwubin/p/3250554.html

  • 相关阅读:
    javascript学习一
    对软件工程课程的认识
    人月神话读后感
    项目开发总结报告(GB8567——88)
    MFC双缓冲绘图
    QT连接MySQL
    [QT学习]拷贝文件
    Arduino入门笔记【1】
    《人月神话》读后感以及软件工程总结
    十天冲刺任务(第二次冲刺)
  • 原文地址:https://www.cnblogs.com/dongtong/p/7452362.html
Copyright © 2020-2023  润新知