行业资讯

返回 您现在的位置 首页 > 行业资讯

行业资讯

Discuz! X2 sphinx全文搜索安装配置实战

时间:2012-03-21 00:00:00    来源:90    点击:90 次

百度权重查询 站长交易 友情链接交换 网站建设,网站设计,企业建站就找313

首先说明下我的使用环境:win2003 coreseek 3.2.14 gbk的mysql ,如有环境变更,请相应做些变更。

首先下载coreseek-3.2.14稳定版:

http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.14-win32.zip

同时下载Microsoft Visual C 2005 运行环境 (x86)

http://www.microsoft.com/downloads/details.aspx?FamilyID=32bc1bee-a3f9-4c13-9c99-220b62a191ee&displaylang=zh-cn

如果您的win2003补丁更新的比较新,建议您用Microsoft Visual C 2005 SP1 Redistributable Package (x86) 代替上面的,这是是SP1版本,我开始安装的上面的,运行coreseek后报indexer.exe应用程序出错,可能是跟比较高的系统补丁的兼容性的问题,我是升级到最新补丁的。这个地方 coreseek官方都没有更新说明,提醒大家注意。

http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=200B2FD9-AE1A-4A14-984D-389C36F85647

同样,如果您要用coreseek 4.0.1 这个最新版的,我也建议您下载Microsoft Visual C 2008的SP1版本,具体不再详述。

现在解压缩coreseek-3.2.14-win32.zip ,比如解压到D:/ coreseek/ ,现在我们切换到这个目录来说。

修改sphinx配置文件etc\csft.conf

#threads
source threads
{
    type                    = mysql

    sql_host                = localhost
    sql_user                = root
    sql_pass                = 填入数据库密码
    sql_db                    = 填入你的discuz x2.0数据库名称
    sql_port                = 3306
    sql_query_pre            = SET NAMES UTF8     (这里如果数据库是GBK的就修改为gbk,下面所有SET NAME设置同这里)
    sql_query_pre           = SET SESSION query_cache_type=OFF
    sql_query_pre           = CREATE TABLE IF NOT EXISTS sph_counter ( counter_id INTEGER PRIMARY KEY NOT NULL,max_doc_id INTEGER NOT NULL)
    sql_query_pre            = REPLACE INTO sph_counter SELECT 1, MAX(tid)-100 FROM pre_forum_thread

    sql_query                = SELECT t.tid AS id,t.tid,t.subject,t.digest,t.displayorder,t.authorid,t.lastpost,t.special \#p#分页标题#e#
                                FROM pre_forum_thread AS t \
                                WHERE t.tid>=$start AND t.tid<=$end

    sql_query_range            = SELECT (SELECT MIN(tid) FROM pre_forum_thread),max_doc_id FROM sph_counter WHERE counter_id=1
    sql_range_step          = 4096

    sql_attr_uint            = tid
    sql_attr_uint            = digest
    sql_attr_uint            = displayorder
    sql_attr_uint            = authorid
    sql_attr_uint            = special

    sql_attr_timestamp        =lastpost

    sql_query_info            = SELECT * FROM pre_forum_thread WHERE tid=$id
}

#threads
index threads
{
    source            = threads
    path            = var/data/threads #windows下最好用全路径
    docinfo            = extern
    mlock            = 0
    morphology        = none
    #charset_dictpath = /usr/local/mmseg3/etc/    #BSD、Linux环境下设置,/符号结尾
    charset_dictpath= etc/                        #Windows环境下设置,/符号结尾
    charset_debug   =   0
#### 索引的词最小长度
min_word_len = 1
charset_type = utf-8    (这里如果是GBK数据库就修改为zh_cn.gbk ,下同)
html_strip = 0

##### 字符表,注意:如使用这种方式,则sphinx会对中文进行单字切分,
##### 即进行字索引,若要使用中文分词,必须使用其他分词插件如 coreseek,sfc
charset_table = U FF10..U FF19->0..9, 0..9, U FF41..U FF5A->a..z, U FF21..U FF3A->a..z,\
A..Z->a..z, a..z, U 0149, U 017F, U 0138, U 00DF, U 00FF, U 00C0..U 00D6->U 00E0..U 00F6,\#p#分页标题#e#
U 00E0..U 00F6, U 00D8..U 00DE->U 00F8..U 00FE, U 00F8..U 00FE, U 0100->U 0101, U 0101,\
U 0102->U 0103, U 0103, U 0104->U 0105, U 0105, U 0106->U 0107, U 0107, U 0108->U 0109,\
U 0109, U 010A->U 010B, U 010B, U 010C->U 010D, U 010D, U 010E->U 010F, U 010F,\
U 0110->U 0111, U 0111, U 0112->U 0113, U 0113, U 0114->U 0115, U 0115, \
U 0116->U 0117,U 0117, U 0118->U 0119, U 0119, U 011A->U 011B, U 011B, U 011C->U 011D,\
U 011D,U 011E->U 011F, U 011F, U 0130->U 0131, U 0131, U 0132->U 0133, U 0133, \
U 0134->U 0135,U 0135, U 0136->U 0137, U 0137, U 0139->U 013A, U 013A, U 013B->U 013C, \
U 013C,U 013D->U 013E, U 013E, U 013F->U 0140, U 0140, U 0141->U 0142, U 0142, \
U 0143->U 0144,U 0144, U 0145->U 0146, U 0146, U 0147->U 0148, U 0148, U 014A->U 014B, \
U 014B,U 014C->U 014D, U 014D, U 014E->U 014F, U 014F, U 0150->U 0151, U 0151, \
U 0152->U 0153,U 0153, U 0154->U 0155, U 0155, U 0156->U 0157, U 0157, U 0158->U 0159,\
U 0159,U 015A->U 015B, U 015B, U 015C->U 015D, U 015D, U 015E->U 015F, U 015F, \
U 0160->U 0161,U 0161, U 0162->U 0163, U 0163, U 0164->U 0165, U 0165, U 0166->U 0167, \
U 0167,U 0168->U 0169, U 0169, U 016A->U 016B, U 016B, U 016C->U 016D, U 016D, \
U 016E->U 016F,U 016F, U 0170->U 0171, U 0171, U 0172->U 0173, U 0173, U 0174->U 0175,\
U 0175,U 0176->U 0177, U 0177, U 0178->U 00FF, U 00FF, U 0179->U 017A, U 017A, \
U 017B->U 017C,U 017C, U 017D->U 017E, U 017E, U 0410..U 042F->U 0430..U 044F, \
U 0430..U 044F,U 05D0..U 05EA, U 0531..U 0556->U 0561..U 0586, U 0561..U 0587, \
U 0621..U 063A, U 01B9,U 01BF, U 0640..U 064A, U 0660..U 0669, U 066E, U 066F, \
U 0671..U 06D3, U 06F0..U 06FF,U 0904..U 0939, U 0958..U 095F, U 0960..U 0963, \
U 0966..U 096F, U 097B..U 097F,U 0985..U 09B9, U 09CE, U 09DC..U 09E3, U 09E6..U 09EF, \
U 0A05..U 0A39, U 0A59..U 0A5E,U 0A66..U 0A6F, U 0A85..U 0AB9, U 0AE0..U 0AE3, \
U 0AE6..U 0AEF, U 0B05..U 0B39,U 0B5C..U 0B61, U 0B66..U 0B6F, U 0B71, U 0B85..U 0BB9, \
U 0BE6..U 0BF2, U 0C05..U 0C39,U 0C66..U 0C6F, U 0C85..U 0CB9, U 0CDE..U 0CE3, \
U 0CE6..U 0CEF, U 0D05..U 0D39, U 0D60,U 0D61, U 0D66..U 0D6F, U 0D85..U 0DC6, \
U 1900..U 1938, U 1946..U 194F, U A800..U A805,U A807..U A822, U 0386->U 03B1, \
U 03AC->U 03B1, U 0388->U 03B5, U 03AD->U 03B5,U 0389->U 03B7, U 03AE->U 03B7, \
U 038A->U 03B9, U 0390->U 03B9, U 03AA->U 03B9,U 03AF->U 03B9, U 03CA->U 03B9, \
U 038C->U 03BF, U 03CC->U 03BF, U 038E->U 03C5,U 03AB->U 03C5, U 03B0->U 03C5, \
U 03CB->U 03C5, U 03CD->U 03C5, U 038F->U 03C9,U 03CE->U 03C9, U 03C2->U 03C3, \
U 0391..U 03A1->U 03B1..U 03C1,U 03A3..U 03A9->U 03C3..U 03C9, U 03B1..U 03C1, \
U 03C3..U 03C9, U 0E01..U 0E2E,U 0E30..U 0E3A, U 0E40..U 0E45, U 0E47, U 0E50..U 0E59, \#p#分页标题#e#
U A000..U A48F, U 4E00..U 9FBF,U 3400..U 4DBF, U 20000..U 2A6DF, U F900..U FAFF, \
U 2F800..U 2FA1F, U 2E80..U 2EFF,U 2F00..U 2FDF, U 3100..U 312F, U 31A0..U 31BF, \
U 3040..U 309F, U 30A0..U 30FF,U 31F0..U 31FF, U AC00..U D7AF, U 1100..U 11FF, \
U 3130..U 318F, U A000..U A48F,U A490..U A4CF
min_prefix_len = 0
min_infix_len = 1
ngram_len = 1
}

#threads_minute
source threads_minute : threads
{
    sql_query_pre            =
    sql_query_pre            = SET NAMES UTF8
    sql_query_pre           = SET SESSION query_cache_type=OFF

    sql_query_range            = SELECT max_doc_id 1,(SELECT MAX(tid) FROM pre_forum_thread) FROM sph_counter WHERE counter_id=1
}

#threads_minute
index threads_minute : threads
{
    source            = threads_minute
    path            = var/data/threads_minute #windows下最好用全路径
}

#posts
source posts : threads
{
    type                    = mysql

    sql_query_pre            =
    sql_query_pre            = SET NAMES UTF8
    sql_query_pre           = SET SESSION query_cache_type=OFF
    sql_query_pre           = CREATE TABLE IF NOT EXISTS sph_counter ( counter_id INTEGER PRIMARY KEY NOT NULL,max_doc_id INTEGER NOT NULL)
    sql_query_pre            = REPLACE INTO sph_counter SELECT 2, MAX(pid)-5000 FROM pre_forum_post

    sql_query                = SELECT p.pid AS id,p.tid,p.subject,p.message,t.digest,t.displayorder,t.authorid,t.lastpost,t.special \
                                FROM pre_forum_post AS p LEFT JOIN pre_forum_thread AS t USING(tid) \
                                WHERE p.pid>=$start AND p.pid<=$end#p#分页标题#e#

    sql_query_range            = SELECT (SELECT MIN(pid) FROM pre_forum_post),max_doc_id FROM sph_counter WHERE counter_id=2
    sql_range_step          = 4096

    sql_attr_uint            = tid
    sql_attr_uint            = digest
    sql_attr_uint            = displayorder
    sql_attr_uint            = authorid
    sql_attr_uint            = special

    sql_attr_timestamp        =lastpost

    sql_query_info            = SELECT * FROM pre_forum_post WHERE pid=$id
}

#posts
index posts
{
    source            = posts
    path            = var/data/posts #windows下最好用全路径
    docinfo            = extern
    mlock            = 0
    morphology        = none
    #charset_dictpath = /usr/local/mmseg3/etc/    #BSD、Linux环境下设置,/符号结尾
    charset_dictpath= etc/                        #Windows环境下设置,/符号结尾
    charset_debug   =   0
#### 索引的词最小长度
min_word_len = 1
charset_type = utf-8
html_strip = 0

##### 字符表,注意:如使用这种方式,则sphinx会对中文进行单字切分,
##### 即进行字索引,若要使用中文分词,必须使用其他分词插件如 coreseek,sfc
charset_table = U FF10..U FF19->0..9, 0..9, U FF41..U FF5A->a..z, U FF21..U FF3A->a..z,\
A..Z->a..z, a..z, U 0149, U 017F, U 0138, U 00DF, U 00FF, U 00C0..U 00D6->U 00E0..U 00F6,\
U 00E0..U 00F6, U 00D8..U 00DE->U 00F8..U 00FE, U 00F8..U 00FE, U 0100->U 0101, U 0101,\
U 0102->U 0103, U 0103, U 0104->U 0105, U 0105, U 0106->U 0107, U 0107, U 0108->U 0109,\
U 0109, U 010A->U 010B, U 010B, U 010C->U 010D, U 010D, U 010E->U 010F, U 010F,\
U 0110->U 0111, U 0111, U 0112->U 0113, U 0113, U 0114->U 0115, U 0115, \
U 0116->U 0117,U 0117, U 0118->U 0119, U 0119, U 011A->U 011B, U 011B, U 011C->U 011D,\#p#分页标题#e#
U 011D,U 011E->U 011F, U 011F, U 0130->U 0131, U 0131, U 0132->U 0133, U 0133, \
U 0134->U 0135,U 0135, U 0136->U 0137, U 0137, U 0139->U 013A, U 013A, U 013B->U 013C, \
U 013C,U 013D->U 013E, U 013E, U 013F->U 0140, U 0140, U 0141->U 0142, U 0142, \
U 0143->U 0144,U 0144, U 0145->U 0146, U 0146, U 0147->U 0148, U 0148, U 014A->U 014B, \
U 014B,U 014C->U 014D, U 014D, U 014E->U 014F, U 014F, U 0150->U 0151, U 0151, \
U 0152->U 0153,U 0153, U 0154->U 0155, U 0155, U 0156->U 0157, U 0157, U 0158->U 0159,\
U 0159,U 015A->U 015B, U 015B, U 015C->U 015D, U 015D, U 015E->U 015F, U 015F, \
U 0160->U 0161,U 0161, U 0162->U 0163, U 0163, U 0164->U 0165, U 0165, U 0166->U 0167, \
U 0167,U 0168->U 0169, U 0169, U 016A->U 016B, U 016B, U 016C->U 016D, U 016D, \
U 016E->U 016F,U 016F, U 0170->U 0171, U 0171, U 0172->U 0173, U 0173, U 0174->U 0175,\
U 0175,U 0176->U 0177, U 0177, U 0178->U 00FF, U 00FF, U 0179->U 017A, U 017A, \
U 017B->U 017C,U 017C, U 017D->U 017E, U 017E, U 0410..U 042F->U 0430..U 044F, \
U 0430..U 044F,U 05D0..U 05EA, U 0531..U 0556->U 0561..U 0586, U 0561..U 0587, \
U 0621..U 063A, U 01B9,U 01BF, U 0640..U 064A, U 0660..U 0669, U 066E, U 066F, \
U 0671..U 06D3, U 06F0..U 06FF,U 0904..U 0939, U 0958..U 095F, U 0960..U 0963, \
U 0966..U 096F, U 097B..U 097F,U 0985..U 09B9, U 09CE, U 09DC..U 09E3, U 09E6..U 09EF, \
U 0A05..U 0A39, U 0A59..U 0A5E,U 0A66..U 0A6F, U 0A85..U 0AB9, U 0AE0..U 0AE3, \
U 0AE6..U 0AEF, U 0B05..U 0B39,U 0B5C..U 0B61, U 0B66..U 0B6F, U 0B71, U 0B85..U 0BB9, \
U 0BE6..U 0BF2, U 0C05..U 0C39,U 0C66..U 0C6F, U 0C85..U 0CB9, U 0CDE..U 0CE3, \
U 0CE6..U 0CEF, U 0D05..U 0D39, U 0D60,U 0D61, U 0D66..U 0D6F, U 0D85..U 0DC6, \
U 1900..U 1938, U 1946..U 194F, U A800..U A805,U A807..U A822, U 0386->U 03B1, \
U 03AC->U 03B1, U 0388->U 03B5, U 03AD->U 03B5,U 0389->U 03B7, U 03AE->U 03B7, \
U 038A->U 03B9, U 0390->U 03B9, U 03AA->U 03B9,U 03AF->U 03B9, U 03CA->U 03B9, \
U 038C->U 03BF, U 03CC->U 03BF, U 038E->U 03C5,U 03AB->U 03C5, U 03B0->U 03C5, \
U 03CB->U 03C5, U 03CD->U 03C5, U 038F->U 03C9,U 03CE->U 03C9, U 03C2->U 03C3, \
U 0391..U 03A1->U 03B1..U 03C1,U 03A3..U 03A9->U 03C3..U 03C9, U 03B1..U 03C1, \
U 03C3..U 03C9, U 0E01..U 0E2E,U 0E30..U 0E3A, U 0E40..U 0E45, U 0E47, U 0E50..U 0E59, \
U A000..U A48F, U 4E00..U 9FBF,U 3400..U 4DBF, U 20000..U 2A6DF, U F900..U FAFF, \
U 2F800..U 2FA1F, U 2E80..U 2EFF,U 2F00..U 2FDF, U 3100..U 312F, U 31A0..U 31BF, \
U 3040..U 309F, U 30A0..U 30FF,U 31F0..U 31FF, U AC00..U D7AF, U 1100..U 11FF, \
U 3130..U 318F, U A000..U A48F,U A490..U A4CF
min_prefix_len = 0
min_infix_len = 1
ngram_len = 1
}

#posts_minute
source posts_minute : posts
{
    sql_query_pre            =#p#分页标题#e#
    sql_query_pre            = SET NAMES UTF8
    sql_query_pre           = SET SESSION query_cache_type=OFF

    sql_query_range            = SELECT max_doc_id 1,(SELECT MAX(pid) FROM pre_forum_post) FROM sph_counter WHERE counter_id=2
}

#posts_minute
index posts_minute : posts
{
    source            = posts_minute
    path            = var/data/posts_minute #windows下最好用全路径
}

#全局indexer定义
indexer
{
    mem_limit            = 256M
}

#searchd服务定义
searchd
{
    listen              = 3312
    read_timeout        = 5
    max_children        = 30
    max_matches            = 10000
    seamless_rotate        = 0
    preopen_indexes        = 0
    unlink_old            = 1
    pid_file            = var/log/searchd_discuzx.pid #windows下最好用全路径
    log                 = var/log/searchd_discuzx.log #windows下最好用全路径
    query_log           = var/log/query_discuzx.log #windows下最好用全路径
}

设置好csft.conf 后我们就可以点击test.cmd 开始生成索引并开启全文搜索服务了,此过程跟你的数据库大小有关系,耐心等待一会。

至此全文搜索服务器搭建好了,开始Discuz的设置

登录后台: 全局 – 搜索 开启全文搜索

这里要修改两个个地方,discuz自己写错了一个单词 threads_mintue 和posts_mintue

后面分钟的单词写错了,我不知道是不是他们故意的,邪恶下~~

分别修改为:threads_minute 和posts_minute

再要修改程序source\module\search\search_forum.php

找到237行左右

if($srchtype == 'fulltext' && $_G['setting']['sphinxon']) {

修改为:

//  if($srchtype == 'fulltext' && $_G['setting']['sphinxon']) {#p#分页标题#e#
 if($srchtxt && $_G['setting']['sphinxon']) {

对于要修改的原代码我习惯用//屏蔽,方便以后找回或者对照。

网上大部分说是直接用if($_G['setting']['sphinxon']) {

这样子是有问题的,就是搜索最新帖子的时候没有关键字,只能用系统自带的。

至此,discuz x2 的全文搜索就ok了,这个对于拥有独立服务器并且帖子数量相对多些的论坛非常有用,且占用服务器资源非常小。discuz x2 全文搜索演示站点:http://bbs.tumuzhe.com 土木者论坛。

本文由tumuzhe 原创,转摘请注明出处,谢谢!