Sphinx中文分词在discuz 中的应用

Sphinx中文分词在discuz 中的应用。

Sphinx-for-chinese是一款专注于中文搜索的全文检索软件,在sphinx的基础上添加了中文处理模块并优化了中文搜索效果。相比而言,以某某论坛几千万数据环境来看,比Coreseek封装的sphinx中文分词+mmseg3组合要好一点

1.准备环境

cd /var/tmp/
wget http://www.sphinx-search.com/downloads/sphinx-for-chinese-2.2.1-dev-r4311.tar.gz
wget http://docs.zjyxh.com/discuzx/sphinx-for-chinese/xdict
mkdir -p /data0/dzbbs/indexdata/
mkdir -p /data1/dzbbs/indexdata/

2.安装 sphinx for chinese

CXX=gcc
CFLAGS=" -O3 -fomit-frame-pointer -pipe -march=nocona -mfpmath=sse -m128bit-long-double -mmmx -msse -msse2 -maccumulate-outgoing-args -m64 -ftree-loop-linear -fprefetch-l
oop-arrays -freg-struct-return -fgcse-sm -fgcse-las -frename-registers -fforce-addr -fivopts -ftree-vectorize -ftracer -frename-registers -minline-all-stringops -fbranch-target-
load-optimize2"
CXXFLAGS="${CFLAGS}"
export CXX CXXFLAGS CFLAGS
tar zxf sphinx-for-chinese-2.2.1-dev-r4311.tar.gz
cd sphinx-for-chinese-2.2.1-dev-r4311
./configure --prefix=/usr/local/sfc22/ --with-mysql=/usr/local/mysql/ --enable-id64
make -j8 install

3.配置 sphinx for chinese

cd /usr/local/sfc22/etc/

mv xdict xdictbak

cp -a /var/tmp/xdict .

vim  sphinx.conf


source pre_forum_thread

{

type                    = mysql

sql_host                = localhost

sql_user               = sphinx

sql_pass                = sphinx2013

sql_db                  = discuzx

sql_port                = 3306

sql_query_pre            = SET NAMES UTF8

sql_query_pre           = SET SESSION query_cache_type=OFF

sql_query_pre            = REPLACE INTO pre_common_sphinxcounter SELECT 1, MAX(tid) 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 \

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),maxid FROM pre_common_sphinxcounter WHERE indexid=1

sql_range_step          = 5000

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 pre_forum_thread

{

source            = pre_forum_thread

path            = /data0/dzbbs/indexdata/pre_forum_thread #windows下最好用全路径

docinfo            = extern

mlock            = 0

morphology        = none

#charset_dictpath = /usr/local/mmseg32/etc/    #BSD、Linux环境下设置,/符号结尾

#charset_dictpath= etc/                        #Windows环境下设置,/符号结尾

#charset_debug   =   0

#### 索引的词最小长度

min_word_len = 2

#charset_type = zh_cn.utf-8

html_strip = 1

##### 字符表,注意:如使用这种方式,则sphinx会对中文进行单字切分,

##### 即进行字索引,若要使用中文分词,必须使用其他分词插件如 coreseek,sfc

charset_type = utf-8

chinese_dictionary = /usr/local/sfc22/etc/xdict

min_prefix_len = 0

min_infix_len = 1

ngram_len = 0

}

#threads_minute

source pre_forum_thread_minute : pre_forum_thread

{

#sql_query_pre            =

sql_query_pre            = SET NAMES UTF8

sql_query_pre            = SET SESSION query_cache_type=OFF

sql_query_range          = SELECT maxid-1,(SELECT MAX(tid) FROM pre_forum_thread) FROM pre_common_sphinxcounter WHERE indexid=1

}

#threads_minute

index pre_forum_thread_minute : pre_forum_thread

{

source            = pre_forum_thread_minute

path            = /data0/dzbbs/indexdata/pre_forum_thread_minute #windows下最好用全路径

}

#posts

source pre_forum_post : pre_forum_thread

{

type                     = mysql

sql_query_pre            =

sql_query_pre            = SET NAMES UTF8

sql_query_pre            = SET SESSION query_cache_type=OFF

sql_query_pre            = REPLACE INTO pre_common_sphinxcounter SELECT 2, MAX(pid) 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 \

AND p.first=1

sql_query_range          = SELECT (SELECT MIN(pid) FROM pre_forum_post),maxid FROM pre_common_sphinxcounter WHERE indexid=2

sql_range_step           = 5000

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 pre_forum_post

{

source            = pre_forum_post

path            = /data1/dzbbs/indexdata/pre_forum_post #windows下最好用全路径

docinfo            = extern

mlock            = 0

morphology        = none

#charset_dictpath = /usr/local/mmseg32/etc/    #BSD、Linux环境下设置,/符号结尾

#charset_dictpath= etc/                        #Windows环境下设置,/符号结尾

#charset_debug   =   0

#### 索引的词最小长度

min_word_len = 2

#charset_type = zh_cn.utf-8

html_strip = 0

##### 字符表,注意:如使用这种方式,则sphinx会对中文进行单字切分,

##### 即进行字索引,若要使用中文分词,必须使用其他分词插件如 coreseek,sfc

charset_type = utf-8

chinese_dictionary = /usr/local/sfc22/etc/xdict

min_prefix_len = 0

min_infix_len = 1

ngram_len = 0

}

#pre_forum_post_minute

source pre_forum_post_minute : pre_forum_post

{

sql_query_pre            = SET NAMES UTF8

sql_query_pre           = SET SESSION query_cache_type=OFF

sql_query_range            = SELECT maxid-1,(SELECT MAX(pid) FROM pre_forum_post) FROM pre_common_sphinxcounter WHERE indexid=2

}

#pre_forum_post_minute

index pre_forum_post_minute : pre_forum_post

{

source            = pre_forum_post

path            = /data0/dzbbs/indexdata/pre_forum_post #windows下最好用全路径

}

#全局indexer定义

indexer

{

mem_limit            = 2047M

write_buffer         = 64M

}

#searchd服务定义

searchd

{

listen              = 3312

read_timeout        = 5

max_children        = 30

max_matches         = 500

listen_backlog      = 20

seamless_rotate     = 0

preopen_indexes     = 0

max_filter_values   = 16384

max_filters         = 1024

mva_updates_pool    = 16M

max_packet_size     = 32M

read_buffer         = 1M

unlink_old          = 1

pid_file            = /usr/local/sfc22/var/log/searchd_discuzx.pid #windows下最好用全路径

log                 = /usr/local/sfc22/var/log/searchd_discuzx.log #windows下最好用全路径

query_log           = /usr/local/sfc22/var/log/query_discuzx.log #windows下最好用全路径

}

4 测试sfc 中文分词效果。

/usr/local/sfc22/bin/search -c /usr/local/sfc22/etc/sphinx.conf 分享精彩

words:

1. ‘分享‘: 194 documents, 266 hits

2. ‘精彩‘: 368 documents, 425 hits

3. ‘精彩视频‘: 2 documents, 2 hits

4. ‘精彩节目‘: 2 documents, 2 hits

5. ‘精彩绝伦‘: 2 documents, 2 hits

6. ‘精彩纷呈‘: 7 documents, 7 hits

7. ‘精彩瞬间‘: 5 documents, 5 hits

8. ‘精彩回顾‘: 2 documents, 3 hits

可以看出sfc 中文分词效果还是比较准确的。

5 启动sfc

/usr/local/sfc22/bin/searchd -c /usr/local/sfc22/etc/sphinx.conf

6 编写主索引和增量索引脚本

1)编写主题表主索引和增量索引以及帖子表增量索引,每20分钟运行一次。

vim /usr/local/bin/bbssearch.sh

#!/bin/bash
#desc: this scripts for sphinx for chinese index
#date:2014.12.23
#testd in CentOS 6.5 x86_64
#saved in /usr/local/bin/bbssearch.sh
#written by [email protected] coralzd.blog.51cto.com blog.zjyxh.com
export PATH=/usr/local/sfc22/bin/:/sbin/:$PATH
Y=$(date +%Y)
m=$(date +%m)
d=$(date +%d)
# create thread merge index
echo "-- thread main index start `date +${Y}-${m}-${d}.%H:%M:%S` --"  >> /var/log/sphinx.log
indexer pre_forum_thread_minute --rotate
echo "-- thread merge index end `date +${Y}-${m}-${d}.%H:%M:%S` --"  >> /var/log/sphinx.log
# create post merge index
echo "-- post main index start `date +${Y}-$m-$d.%H:%M:%S` --"  >> /var/log/sphinx.log
indexer pre_forum_post_minute --rotate
echo "-- post merge index end `date +${Y}-$m-$d.%H:%M:%S` --"  >> /var/log/sphinx.log
# main  index + merge index thread
echo "-- thread main merge + index start `date +${Y}-${m}-${d}.%H:%M:%S` --"  >> /var/log/sphinx.log
indexer --merge pre_forum_thread pre_forum_thread_minute --merge-dst-range deleted 0 0 --rotate
echo "-- thread main merge + index end `date +${Y}-${m}-${d}.%H:%M:%S` --"  >> /var/log/sphinx.log

2)编写帖子表主索引,每周运行一次。

vim /usr/local/bin/bbssearch2.sh

#!/bin/bash
#desc: this scripts for sphinx for chinese index
#date:2014.12.23
#testd in CentOS 6.5 x86_64
#saved in /usr/local/bin/bbssearch2.sh
#written by [email protected] coralzd.blog.51cto.com blog.zjyxh.com
export PATH=/usr/local/sfc22/bin/:/sbin/:$PATH
Y=$(date +%Y)
m=$(date +%m)
d=$(date +%d)
# create post merge index
echo "-- post main index start `date +${Y}-$m-$d.%H:%M:%S` --"  >> /var/log/sphinx.log
indexer pre_forum_post --rotate
echo "-- post merge index end `date +${Y}-$m-$d.%H:%M:%S` --"  >> /var/log/sphinx.log

将其放到crontab 计划任务。

时间: 2024-10-19 15:11:17

Sphinx中文分词在discuz 中的应用的相关文章

(转)Sphinx中文分词安装配置及API调用

这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议这两个中选择一个,暂时不要选择原版Sphinx(对中文的支持不是很好).又因为服务器所用 MySQL在当时编译时并没有编译Sphinx扩展,而重新编译MySQL并加入Sphinx暂时又无法实现(项目用到了多台服务器,在不影响现有业务的 情况下不可能去重新编译MySQL的),所以采用的是程序通过API来外部调用Sphin

Sphinx中文分词安装配置及API调用

这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议这两个中选择一个,暂时不要选择原版Sphinx(对中文的支持不是很好).又因为服务器所用 MySQL在当时编译时并没有编译Sphinx扩展,而重新编译MySQL并加入Sphinx暂时又无法实现(项目用到了多台服务器,在不影响现有业务的 情况下不可能去重新编译MySQL的),所以采用的是程序通过API来外部调用Sphin

Centos下Sphinx中文分词编译安装测试---CoreSeek

要支持中文分词,还需要下载Coreseek,可以去官方搜索下载,这里我用的4.1 百度云下载地址:      https://pan.baidu.com/s/1slNIyHf tar -zxvf coreseek-4.1-beta.tar.gz cd coreseek-4.1-beta cd mmseg-3.2.14/ ./bootstrap   //测试安装环境 libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `config'

中文分词工具jieba中的词性类型

jieba为自然语言语言中常用工具包,jieba具有对分词的词性进行标注的功能,词性类别如下: Ag 形语素 形容词性语素.形容词代码为 a,语素代码g前面置以A. a 形容词 取英语形容词 adjective的第1个字母. ad 副形词 直接作状语的形容词.形容词代码 a和副词代码d并在一起. an 名形词 具有名词功能的形容词.形容词代码 a和名词代码n并在一起. b 区别词 取汉字“别”的声母. c 连词 取英语连词 conjunction的第1个字母. dg 副语素 副词性语素.副词代码

sphinx中文入门指南 (转自sphinx中文站)

Sphinx中文入门指南 wuhuiming<blvming在gmail.com>,转载请注明来源和作者 最后修改:2010年1月23日 1.简介 1.1.Sphinx是什么 1.2.Sphinx的特性 1.3.Sphinx中文分词 2.安装配置实例 2.1 在GNU/Linux/unix系统上安装 2.1.1 sphinx安装 2.1.2.sfc安装(见另文) 2.1.3.coreseek安装(见另文) 2.2 在windows下安装 3. 配置实例 4.应用 4.1 在CLI上测试 4.2

关于Solr搜索标点与符号的中文分词你必须知道的(mmseg源码改造)

摘要:在中文搜索中的标点.符号往往也是有语义的,比如我们要搜索“C++”或是“C#”,我们不希望搜索出来的全是“C”吧?那样对程序员来说是个噩梦.然而在中文分词工具mmseg中,它的中文分词是将标点与符号均去除的,它认为对于中文来讲标点符号无意义,这明显不能满足我们的需求.那么怎样改造它让它符合我们的要求呢?本文就是针对这一问题的详细解决办法,我们改mmseg的源代码. 关键字:Solr, mmseg, 中文, 分词, 标点, 符号, 语义 前提:Solr(5.0.0版本),mmseg4j(1.

php+中文分词scws+sphinx+mysql打造千万级数据全文搜索

Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎.意图为其他应用提供高速.低空间占用.高结果 相关度的全文搜索功能.Sphinx可以非常容易的与SQL数据库和脚本语言集成.当前系统内置MySQL和PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式 的XML数据.Sphinx创建索引的速度为:创建100万条记录的索引只需3-4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒.Sphinx的

Sphinx + Coreseek 实现中文分词搜索

Sphinx + Coreseek 实现中文分词搜索 Sphinx Coreseek 实现中文分词搜索 全文检索 1 全文检索 vs 数据库 2 中文检索 vs 汉化检索 3 自建全文搜索与使用Google等第三方站点提供的站内全文搜索的差别 Sphinx Coreseek介绍 Coreseek安装使用 1. 全文检索 1.1 全文检索 vs. 数据库 全文检索是数据库的有力补充,全文检索并不能替代数据库在应用系统中的作用.当应用系统的数据以大量的文本信息为主时,採用全文检索技术能够极大的提升应

Sphinx+MySQL5.1x+SphinxSE+mmseg中文分词

什么是Sphinx Sphinx 是一个全文检索引擎,一般而言,Sphinx是一个独立的搜索引擎,意图为其它应用提供快速.低空间占用.高结果相关度的全文搜索功能.Sphinx能够很easy的与SQL数据库和脚本语言集成.当前系统内置MySQL和PostgreSQL 数据库数据源的支持.也支持从标准输入读取特定格式的XML数据.通过改动源码.用户能够自行添加新的数据源(比如:其它类型的DBMS的原生支持). Sphinx的特性  快速的建立索引(在当代CPU上,峰值性能可达到10 MB/秒);