• dedecms sphinx 配置


    首先了解一下sphinx全文索引的相关知识,考虑到Sphinx全文索引使用的实际需要,主要介绍Sphinx全文索引中文方面的支持。这里需要感谢李沫南同学对Sphinx全文索引中文支持的贡献!

    官方网站:http://www.sphinxsearch.com/
    官方文档:http://www.sphinxsearch.com/docs/
    中文支持:http://www.coreseek.cn/
    中文使用手册下载:http://www.coreseek.cn/uploads/pdf/sphinx_doc_zhcn_0.9.pdf
    中文在线手册:http://www.coreseek.cn/docs/coreseek_3.2-sphinx_0.9.9.html

    1.Windows下安装Sphinx
    1.1.开始前的准备工作
    先从http://www.coreseek.cn/products/ft_down/下载Coreseek 3.2.13,这里我们就以Windows环境为例:
    下载后直接解压coreseek-3.2.13-win32.zip,我们这里假设解压到:D:\coreseek-3.2.13-win32.这里我们需要简单了解几个目录:

    [D:\coreseek-3.2.13-win32\api]API接口目录,其中包括了php,python,ruby等操作实例,其中test_coreseek.php是一个不错的中文检索的例子.

    [D:\****\bin]应用程序目录,其中包含以下几个文件
        * indexer: 用于创建全文索引;
        * search: 一个简单的命令行(CLI) 的测试程序,用于测试全文索引;
        * searchd: 一个守护进程,其他软件可以通过这个守护进程进行全文检索;
        * sphinxapi: 一系列searchd 的客户端API 库,用于流行的Web脚本开发语言(PHP, Python, Perl, Ruby, Java).
        * spelldump: 一个简单的命令行工具,用于从 ispell 或 MySpell (OpenOffice内置绑定) 格式的字典中提取词条。当使用 wordforms 时可用这些词条对索引进行定制.
        * indextool: 工具程序,用来转储关于索引的多项调试信息。 此工具是从版本Coreseek 3.1(Sphinx 0.9.9-rc2)开始加入的。
        * mmseg: 工具程序和库,Coreseek用于提供中文分词和词典处理。

    [D:\****\etc]sphinx配置目录
    [D:\****\var]sphinx变量&索引&日志存放目录

    1.2.创建配置文件
    由于dedecms使用的是mysql,所以我们需要来配置一个mysql的sphinx模板配置,可以复制csft_mysql.conf改名为:csft_dedecmsv57.conf,例如我们这里仅做文章的全文检索,我们需要做如下配置:
    先在DedeCMS中创建一个统计表,方法可以在DedeCMS后台[系统]->[SQL命令行工具]中执行下列代码:
    CREATE TABLE `dede_sphinx` ( 
        `countid` int(11) unsigned NOT NULL, 
        `maxaid` int(11) unsigned NOT NULL, 
        PRIMARY KEY (`countid`) 
    ) ENGINE=MyISAM DEFAULT CHARSET=gbk
    这是一个sphinx内容统计表,为了适合数据量较大的情况下分批生成索引而使用的.
    创建完数据表后,我们对sphinx的配置文件,即csft_dedecmsv57.conf修改,内容如下,其中包含注释:
    --------------------------------------------------------------------------------------------

    #源定义
    source mysql
    {
        type                    = mysql

        # 数据库服务器基本配置信息
        sql_host                = 192.168.0.103
        sql_user                = dedev57
        sql_pass                = dedecms
        sql_db                  = dedecmsv57gbk
        sql_port                = 3306
        
        # 设定编码,这里我们是gbk编码,如果是utf-8,可以设置:
        # sql_query_pre            = SET NAMES utf8
        sql_query_pre            = SET NAMES gbk
        
        # 数据检索增量
        sql_range_step = 1000
        
        #当前最新文档id数
        sql_query_pre = REPLACE INTO dede_sphinx SELECT 1, MAX(id) FROM dede_archives
        
        #检索条件
        sql_query               = SELECT ARC.id,ARC.typeid,ARC.typeid2,ARC.sortrank,ARC.flag,ARC.channel,ARC.ismake,ARC.arcrank,ARC.click,ARC.title,ARC.shorttitle,ARC.color,ARC.writer,ARC.source,ARC.litpic,ARC.pubdate,ARC.senddate,ARC.mtype,ARC.description,ARC.badpost,ARC.goodpost,ARC.scores,ARC.lastpost,ARC.keywords,ARC.mid,ART.body FROM dede_archives AS ARC LEFT JOIN dede_addonarticle AS ART ON ARC.id = ART.aid WHERE ARC.id>=$start AND ARC.id<=$end #sql_query第一列id需为整数
        #title、body作为字符串/文本字段,被全文索引
        
        # 获取当前最大检索id
        sql_query_range  = SELECT 1,maxaid FROM dede_sphinx WHERE countid=1

                                                
        sql_attr_uint             = typeid            #从SQL读取到的值必须为整数
        sql_attr_uint            = typeid2
        sql_attr_uint            = channel
        sql_attr_uint            = click
        sql_attr_uint            = badpost
        sql_attr_uint            = goodpost
        sql_attr_uint            = scores
        sql_attr_uint            = mid
        sql_attr_timestamp  = pubdate    #从SQL读取到的值必须为整数,作为时间属性
        sql_attr_timestamp  = senddate
        sql_attr_timestamp  = lastpost 

        #命令行查询时,从数据库读取原始数据信息
        sql_query_info            = SELECT ARC.*,ART.body FROM dede_archives AS ARC LEFT JOIN dede_addonarticle AS ART ON ARC.id = ART.aid WHERE ARC.id=$id  
    }

    source delta
    {
        type                    = mysql

        # 数据库服务器基本配置信息
        sql_host                = 192.168.0.103
        sql_user                = dedev57
        sql_pass                = dedecms
        sql_db                  = dedecmsv57gbk
        sql_port                = 3306
        sql_query_pre            = SET NAMES gbk

        # 增量索引,从最大id开始
        sql_query = SELECT ARC.id,ARC.typeid,ARC.typeid2,ARC.sortrank,ARC.flag,ARC.channel,ARC.ismake,ARC.arcrank,ARC.click,ARC.title,ARC.shorttitle,ARC.color,ARC.writer,ARC.source,ARC.litpic,ARC.pubdate,ARC.senddate,ARC.mtype,ARC.description,ARC.badpost,ARC.goodpost,ARC.scores,ARC.lastpost,ARC.keywords,ARC.mid,ART.body FROM dede_archives AS ARC LEFT JOIN dede_addonarticle AS ART ON ARC.id = ART.aid WHERE ARC.id > ( SELECT maxaid FROM dede_sphinx WHERE countid=1 )
        #从SQL读取到的值必须为整数
        
        sql_query_post = REPLACE INTO dede_sphinx SELECT 1, MAX(id) FROM dede_archives
        
        sql_attr_uint             = typeid            
        sql_attr_uint            = typeid2
        sql_attr_uint            = channel
        sql_attr_uint            = click
        sql_attr_uint            = badpost
        sql_attr_uint            = goodpost
        sql_attr_uint            = scores
        sql_attr_uint            = mid
        sql_attr_timestamp  = pubdate    #从SQL读取到的值必须为整数,作为时间属性
        sql_attr_timestamp  = senddate
        sql_attr_timestamp  = lastpost 

        #命令行查询时,从数据库读取原始数据信息
        sql_query_info            = SELECT ARC.*,ART.body FROM dede_archives AS ARC LEFT JOIN dede_addonarticle AS ART ON ARC.id = ART.aid WHERE ARC.id=$id  
    }


    #index定义
    index mysql
    {
        source            = mysql             #对应的source名称
        path            = D:/coreseek-3.2.13-win32/var/data/mysql
        docinfo            = extern
        mlock            = 0
        morphology        = none
        min_word_len        = 1
        html_strip                = 0
        #charset_dictpath = /usr/local/mmseg3/etc/    #BSD、Linux环境下设置,/符号结尾
        charset_dictpath = D:/coreseek-3.2.13-win32/etc/                        #Windows环境下设置,/符号结尾
        charset_type        = zh_cn.gbk
    }

    index delta : mysql
    {
        min_word_len        = 1
        source = delta
        path            = D:/coreseek-3.2.13-win32/var/data/delta.new
    }


    #全局index定义
    indexer
    {
        mem_limit            = 128M
    }

    #searchd服务定义
    searchd
    {
        listen                  =   9312
        read_timeout        = 5
        max_children        = 30
        max_matches            = 1000
        seamless_rotate        = 0
        preopen_indexes        = 0
        unlink_old            = 1
        pid_file = D:/coreseek-3.2.13-win32/var/log/searchd_mysql.pid
        log = D:/coreseek-3.2.13-win32/var/log/searchd_mysql.log
        query_log = D:/coreseek-3.2.13-win32/var/log/query_mysql.log
    }


    -------------------------------------------------------------------------------------------------------

    1.3.建立索引
    配置完成后,我们要先建立索引,在开始菜单中打开[运行],输入"cmd",确认后打开命令行.输入下列代码:

    d:&cd D:\coreseek-3.2.13-win32\bin

    先切换到sphinx的bin目录,然后再执行:

    indexer.exe -c D:\coreseek-3.2.13-win32\etc\csft_dedecmsv57.conf mysql --rotate

    这个时候sphinx开始构建索引,如果数据量比较大,这个时间可能比较长,需要耐心等待(如图1).

     

    然后再创建下增量索引,使用下列命令:
    indexer.exe -c D:\coreseek-3.2.13-win32\etc\csft_dedecmsv57.conf delta --rotate


    1.4.测试检索是否正常
    建立完索引之后我们来检测下是否能够正常搜索到匹配内容,可以继续在cmd中输入下列命令:

    search.exe -c D:\coreseek-3.2.13-win32\etc\csft_dedecmsv57.conf dedecms

    如果能够正常返回数据(如图2),则说明已经成功建立索引.

     

    2.结合DedeCMS程序使用sphinx
    2.1.开启sphinx服务
    在上面的步骤中我们已经成功生成了索引,接下来为了能够使用客户端调用则需要开启sphinx服务.
    可以直接在cmd中执行:
    searchd.exe -c D:\coreseek-3.2.13-win32\etc\csft_dedecmsv57.conf
    这样我们就开启了sphinx服务(如图3),我们可以写一个简单的例子进行测试:

     

    sphinx_test.php
    --------------------------------------------------------------------------------------------------------
    <?php
    set_time_limit(0);
    require_once (dirname(__FILE__) . "/include/common.inc.php");
    $sphinx = new SphinxClient;

    $mode = SPH_MATCH_ANY;            //匹配模式
    $host = "localhost";            //服务ip
    $port = 9312;    //服务端口
            
    $sphinx->SetServer($host, $port);
    $sphinx->SetArrayResult(true);
    $sphinx->SetMatchMode($mode);

    $res = $sphinx->Query('织梦内容管理系统');

    //var_dump($sphinx);
    //var_dump($res);
    $total = count($res['matches']);
    for($i=0; $i < $total; $i++)
    {
        var_dump($res['matches'][$i]);
    }

    -----------------------------------------------------------------------------------------------------
    执行sphinx_test.php,可以看到已经能够正常通信,并且返回了内容.

     

    2.2.创建一个DedeSphinx服务
    上面我们通过searchd.exe开启了服务,但不好的是,我们关闭了cmd窗口就不能继续访问了,解决办法如下:
    同样切换到bin目录下,执行:

    searchd.exe --install -c D:\coreseek-3.2.13-win32\etc\csft_dedecmsv57.conf --servicename DedeSphinx
    这样就在系统中成功创建了一个DedeSphinx服务,无需再打开窗口(如图5).

     

    3.更新与维护
    对于全文检索的索引,我们是需要不定期生成的,如果是数据量比较小,直接使用上述生成索引的命令重建就可以,如果数据量比较大,我们则需要定义的更新全文索引.

    如果内容更新比较频繁,下列的命令需要每分钟被执行一次(可以创建一个脚本,使用windows计划任务定期执行)

    生成增量索引:

    indexer.exe -c D:\coreseek-3.2.13-win32\etc\csft_dedecmsv57.conf delta --rotate

    当然每一天都需要将增量索引合并到主索引mysql中去,需要执行:

    indexer.exe -c D:\coreseek-3.2.13-win32\etc\csft_dedecmsv57.conf --merge mysql delta --rotate

    source:http://www.cnblogs.com/liuguanghuiyes/archive/2012/06/01/2531330.html

  • 相关阅读:
    hdu 5224 Tom and paper 水题
    2015 UESTC 搜索专题N题 韩爷的梦 hash
    2015 UESTC 搜索专题M题 Palindromic String 马拉车算法
    2015 UESTC 搜索专题K题 秋实大哥の恋爱物语 kmp
    2015 UESTC 搜索专题J题 全都是秋实大哥 kmp
    2015 UESTC 搜索专题F题 Eight Puzzle 爆搜
    2015 UESTC 搜索专题E题 吴队长征婚 爆搜
    2015 UESTC 搜索专题D题 基爷的中位数 二分
    2015 UESTC 搜索专题C题 基爷与加法等式 爆搜DFS
    2015 UESTC 搜索专题B题 邱老师降临小行星 记忆化搜索
  • 原文地址:https://www.cnblogs.com/zfying/p/2627074.html
Copyright © 2020-2023  润新知