coreseek sphinx+mmseg 斯分克斯 + 中文分词安装

时间:2022-04-02 08:33:39

sphinx 就全文检索技术,在一个大型的网站,有上亿条的数据要检索时,用传统的 mysql语名来查询的话,可能要几分钟甚至十多分钟,没有效率,浪费资源,这时我们可以使用sphinx的全文检索功能,就可以在几秒中之内查到自己想要的数据

sphinx的工作原理大至可以这样理解

它快速检索数据库中的每一条记录,然后把记录中的词分出来,并维护一个 表,表中的记录是分出来的词,对应的数据库的那一条数据的主键,当我们拿到主键后,就可以直接到,数据库表中得到这些数据,提高效率

因为英文的中间会有 空格 作用词与词之间的分隔,而汉语中没有空格作为界限,所以中文分词对sphinx来说是比较困难的,所以有了mmseg ,它可以很好的帮助sphinx来进行中文分词

因此就有了  coreseek 软件,其实限上就是    coreseek = sphinx + mmseg



安装coreseek

从网上下载 coreseek 的软件源码包          coreseek-4.1-beta.tar.gz

解压这个包可以得到  

csft-1.4(就是sphinx  这是在coreseek中的 )                        mmseg-3.2.14(这个就是中文分词)       README.txt            testpack( 这时种编程语言的类包,比如说,对php 来说可以有两种方法使用sphinx

第一种方法: 在testpack文件夹中打到  api 文件夹  再找到 sphinxapi.php     以后在php 文件中引入就可以用了, 如,include_once "sphinxapi.php";

第二种方法:通过 phpize 编辑    把sphinx当作php 的一个模块来加入      spinx.so  ,然后在 php.ini文件中 extensition sphinx.so  就可以了,一劳永逸

)


一. 因为sphinx的安装要mmseg的支持,所以这里我们先装mmseg

首先建一个mmseg的安装目录   mkdir   /usr/local/mmseg

步骤如下   ;

 # cd mmseg-3.2.14

# ./configure --prefix=/usr/local/mmseg

检查编辑环境时会出错  如图  coreseek   sphinx+mmseg  斯分克斯 + 中文分词安装

这时就yum 安装一下  automake   autoconf    还有 libtool (具体的现在还不知道为什么这样做,网上都是说的解决方法而不知为什么)

yum install -y automake autoconf  libtool

然后写入以下命令

# aclocal

这条命令会报错,不管它

# libtoolize   --force

# automake --add-missing

这条命令也会报  warning 不管它

# autoconf

# autoheader

# 再次   ./cofnigure  --prefix= /usr/local/mmseg

这次检查就会通过

这之后就  make  && make install    mmseg安装完成

补充(

原因分析
aclocal是个扫描程序, 负责扫描configure.ac中所有的宏定义并展开,
上面产生的原因就是找不到LIBTOOL宏的定义之处造成的.原因就是aclocal与libtool没有安装在一个相同目录下面aclocal是去默认 安装目录
/usr/share/aclocal下面搜索所有的.m4文件找所定义的宏,但是由于安装了多个aclocal,可能aclocal目录不存在,实际目录为/usr/share/aclocal1.10等,
这就造成了aclocal找不到m4文件的情况, 解决办法就是将文件夹aclocal1.10重命名为aclocal.或者显示指定路径 aclocal
-I /usr/share/aclocal1.10 -I /usr/share/libtool/m4 --install 或者把/usr/share/libtool/m4下面的文件都copy至/usr/share/aclocal1.10中.
本人的机器上是
/usr/share/下有2个文件夹 一个是aclocal,一个是aclocal-1.11,首先将aclocal的所有文件拷贝到aclocal-1.11下
cp -R /user/share/aclocal/* /usr/share/aclocal-1.11/




二。安装csft  (也就是sphinx)

进入csft目录 ,会发现,居然没有  configure 的文件,晕,我的办法是和上面的流程一样

Sphinx/Coreseek 4.1 执行 buildconf.sh 报错,无法生成configure文件,

  解决方案:

     1. 在 csft-4.1/buildconf.sh 文件中,查找

&& aclocal \

     后加上

&& automake --add-missing \

     2. 在 csft-4.1/configure.ac 文件中,查找:
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
     改为:
AM_INIT_AUTOMAKE([-Wall foreign])

     查找:
AC_PROG_RANLIB 
     后面加上
AM_PROG_AR

      3. 最后,在 csft-4.1/src/sphinxexpr.cpp 文件中, 替换所有:
T val = ExprEval ( this->m_pArg, tMatch );
      成为:
T val = this->ExprEval ( this->m_pArg, tMatch );
以上修改完成后,就生成 ./configure 文件
安装csft
./configure --prefix=/usr/local/coreseek --with-mysql --with-mmseg=/usr/local/mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/
 
我的mysql是rpm安装的,所以 --with-mysql 后面没有写   如果mysql是编辑安装的, 要写mysql的目录

然后就 make && make install
进入 /usr/local/coreseek/etc目录 因为coreseek的默认配置文件是 csft.conf 所以,把这个目录中的 sphinx.conf.dist 复制一份 为 csft.conf cp sphinx.conf.dist csft.conf

配置文件
名为main的主数据源:source main{}
继承名为main的增量数据源:source delta:main{}
名为main的主索引:index main{}
继承名为main的增量索引:index delta:main{}
分布式索引:index dist1{}
索引器:indexer{}
服务进程:searchd{}

修改配置文件中主数据源的mysql配置,测试环境的数据源名为main,假设mysql中test有张表叫post
source main
{
# data source type. mandatory, no default value
# known types are mysql, pgsql, mssql, xmlpipe, xmlpipe2, odbc
type
= mysql

#####################################################################
## SQL settings (
for 'mysql' and 'pgsql' types)
#####################################################################

# some straightforward parameters
for SQL source types
sql_host
= localhost
sql_user
= root
sql_pass
= admin
sql_db
= test
sql_port
= 3306 # optional, default is 3306


sql_sock
= /tmp/mysqld.sock #如果是linux下需要开启,指定sock文件

sql_query_pre
= SET NAMES utf8
sql_query_pre
= SET SESSION query_cache_type=OFF #关闭缓存


# main document fetch query
# mandatory, integer document ID field MUST be the first selected column
sql_query
= \ #获取数据的sql语句
SELECT
id,title,content FROM post


#sql_attr_uint
= group_id #对排序字段进行注释


#sql_attr_timestamp
= date_added #对排序字段进行注释


sql_query_info
= SELECT * FROM post WHERE id=$id


}
注释掉所有增量数据源,修改主索引

index main
{
source
= main

# index files path and
file name, without extension
# mandatory, path must be writable, extensions will be auto
-appended
path
= /usr/local/sphinx/var/data/main

docinfo
= extern
mlock
= 0
morphology
= none
# default is
1 (index everything)
min_word_len
= 1

# charset encoding type
# optional, default is
'sbcs'
# known types are
'sbcs' (Single Byte CharSet) and 'utf-8'
charset_type
= utf-8
#
'utf-8' default value is
# charset_table
= 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F

}

注释掉所有的增量索引和分布式索引

有些配置改动如下其他配置内容如上文的sphinx.conf
在索引源中注释掉txt
index main{
#stopwords = G:\data\stopwords.txt
#wordforms =G:\data\wordforms.txt
#exceptions =/data/exceptions.txt
#charset_type = sbcs
#添加下面2行 意思是把中文分词加入到配置文件中
charset_type = zh_cn.utf-8
charset_dictpath =/usr/local/mmseg/etc/ #你安装mmseg的目录
}

保存配置
建立索引
cd /usr/local/coreseek/bin
./indexer --all
./search 中文词缀