centos下的中文分词coreseek-4.1的编译安装与基本配置

来源:互联网 发布:js 分享 编辑:程序博客网 时间:2024/06/05 20:39
http://files.opstool.com/man/coreseek-4.1-beta.tar.gz

coreseek-4.1-beta.tar.gz 包含了分词包 mmseg-3.2.14 和搜索包 csft-4.1。

tar -zxf coreseek-4.1-beta.tar.gz;

第一步,安装mmseg分词包

cd /usr/local/src/coreseek-4.1-beta/mmseg-3.2.14
./bootstrap    ##输出的warning信息可以忽略,如果出现error则需要解决
./configure --prefix=/usr/local/mmseg3
make && make install


如果提示:config.status: WARNING:  'Makefile.in' seems to ignore the --datarootdir setting
config.status: error: cannot find input file: src/Makefile.in
则执行以下命令:

先检测你的autoconf和automake安装没有,有的还要求版本,通过yum安装autoconf automake

  1. [root@linux mmseg-3.2.14]# yum -y install autoconf automake  
  2. [root@linux mmseg-3.2.14]# aclocal  
  3. aclocal:configure.in:26: warning: macro `AM_PROG_LIBTOOL' not found in library  
  4. [root@linux mmseg-3.2.14]# yum -y install libtool  
  5. [root@linux mmseg-3.2.14]# aclocal  
  6. [root@linux mmseg-3.2.14]# libtoolize --force  
  7. Putting files in AC_CONFIG_AUX_DIR, `config'.  
  8. [root@linux mmseg-3.2.14]# automake --add-missing  
  9. [root@linux mmseg-3.2.14]# autoconf  
  10. [root@linux mmseg-3.2.14]# autoheader  
  11. [root@linux mmseg-3.2.14]# make clean 
然后执行安装即可


安装完毕后可进行以下测试

创建测试文件

touch /usr/local/src/1.txt

echo '今天有人请客吃饭,去不去' > /usr/local/src/1.txt

进行分词测试

/usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc /usr/local/src/1.txt    -d为设置使用etc下面的分词包进行分词

这个将输出:

今天/x 有人/x 请客/x 吃饭/x ,/x 去/x 还是/x 不/x 去/x

如上则说明分词工具安装正确。


第二步,安装csft-4.1 ,这个里面即是sphinx的功能实现

cd /usr/local/src/coreseek-4.1-beta/csft-4.1

现需要执行buildconf.sh文件来生成configure文件

./buildconf.sh

如果sh buildconf.sh最后没有生成configure脚本,且提示automake: warnings are treated as errors,可以将configure.ac中的这行

AM_INIT_AUTOMAKE([-Wall -Werror foreign])

改为

AM_INIT_AUTOMAKE([-Wall foreign])

即删掉-Werror,然后重新运行sh buildconf.sh。

如果configure的时候提示没有安装MySQL的头文件,安装libmysql++-dev包即可。

如没其他错误,生成configure后可执行编译安装:

./configure --prefix=/usr/local/csft4 --with-mmseg --without-unixodbc --with-mmseg-includes=/usr/local/mmseg4/include/mmseg --with-mmseg-libs=/usr/local/mmseg4/lib/ --with-mysql

coreseek 编译时会自动加入 mysql 支持,除非你手动添加 --without-mysql 参数,可以通过 ./configure --help 看到。 而加入 mysql 支持, coreseek 需要知道 mysql.h 和 libmysqlclient.so(Mac 下为 libmysqlclient.dylib) 的位置。

coreseek 获取 mysql.h 和 libmysqlclient.so 的位置的两种方式:

首先需要明确:当 sphinx 知道 mysql_config 的位置时,会从 mysql_config 中获取 includes 和 libs 的路径, 否则需要手工指定 includes 和 libs 的路径。

    1、通过参数 --with-mysql:当 mysql_config 在环境变量中时,可以直接使用 --with-mysql 参数,而无需指定任何路径信息, sphinx 会自动从 mysql_config 命令的结果中提取 includes 和 libs 的路径, 当 mysql_config 不在环境变量中时,使用 --with-mysql=/path/to/mysql 指定 mysql_config 的路径, sphinx 会自动在指定路径下的 bin 目录下寻找 mysql_config 文件,所以目录结构应为: /path/to/mysql/bin/mysql_config。
    2、通过参数 --with-mysql-includes 和 --with-mysql-libs 直接指定 includes 和 libs 的路径。 如:--with-mysql-includes=/path/to/mysql/include --with-mysql-libs=/path/to/mysql/lib。

注意:是否使用 --with-mysql-includes 和 --with-mysql-libs 参数,只跟 sphinx 是否可以找到 mysql_config 文件有关, 二者选其一即可。

成功会提示 :Thank you for choosing Sphinx!

但是make时报错:
sphinxexpr.cpp:1746:43: 错误:‘ExprEval’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]

这是因为gcc版本在4.7以上,编译的时候出现的sphinx的一个bug报错

如下解决:

参看:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=667378

你也可以直接修改csft-4.1/src/sphixexpr.cpp文件的1746, 1777和1823行,将三行中的ExprEval改为this->ExprEval。

修改完毕如无其他错误则执行make && make install

最后安装辅助工具

将csft-4.1/contrib/scripts目录下的searchd脚本拷贝到/etc/init.d/目录下,即可使用service命令启动和终止searchd服务并能够配置开机自启动设置。


另外需要注意的是,拷贝到init.d后这个文件还需要一定的配置如:

    14 SUDO_USER=searchd   --指定用户
     15
     16 BASE_PATH=/usr/local/csft4 --指定路径
     17 PID_FILE=$BASE_PATH/pids/searchd.pid
     18 CONFIG_FILE=$BASE_PATH/etc/csft.conf  --指定配置
     19
     20 EXEC_PATH=$BASE_PATH
     21 LOG_PATH=$EXEC_PATH/logs  --指定日志路径
     22
     23 RETVAL=0
     24 prog="searchd"


使用这个配置文件开启searchd服务时,默认里面配置的用户为searchd用户,所以要么更改要么新建searchd用户和组=====

groupadd -r searchd && useradd -r -g searchd -s /bin/false -M searchd

然后记得将csft的安装目录所有者改为searchd


安装好coreseek后,将/usr/local/coreseek/share/man/目录下的所有文件和目录都拷贝到/usr/local/share/man/目录里,即可使用man命令查看indexer和searchd的使用手册。


安装完毕后可在安装目录看下:

bin/            sphinx的程序目录
    searchd     搜索服务器程序
    indexer     索引建立工具
etc/
            配置文件目录
默认配置文件 example.sql  sphinx.conf.dist  sphinx-min.conf.dist

share/
    man/        sphinx的man手册,建议拷贝到系统man目录,方便查询
var/
    data/       默认的索引存放目录
    log/        默认的日志目录和pid文件目录



如没问题则配置csft.conf,coreseek 默认会找安装目录(/usr/local/csft4)下的 etc/csft.conf 作为配置文件

cd /usr/local/csft4/etc/

cp sphinx-min.conf.dist csft.conf

如果你不想这样使用默认配置csft.conf,可以使用 -c /path/to/filename.conf 指定配置文件,如:

$ ./bin/indexer -c etc/sphinx-min.conf.dist --all     ----即使用了未修改为csft.conf的源文件。


现在就可以对配置文件进行自定义的编辑了:



    4 #定义数据源
      5 source src1
      6 {
      7         type                    = mysql
      8         sql_host                = localhost
      9         sql_user                = root
     10         sql_pass                =
     11         sql_db                  = test_sph
     12         sql_port                = 3306  # optional, default is 3306
     13         sql_query_pre           = SET NAMES utf8
     14         sql_sock                =/usr/local/mysql/mysql.sock    --特别注意的是如果安装mysql时将mysql.sock通信文件未未使用默认的/var/lib/mysql/mysql.sock,而是自定义了地址,那么这里必须声明。
     15
     16         sql_query               = \
     17                 SELECT id,title, content \
     18                 FROM documents
     19
     20         sql_attr_uint           = group_id
     21         sql_attr_timestamp      = date_added
     22
     23         sql_query_info          = SELECT * FROM documents WHERE id=$id
     24 }




    26 #定义索引
     27 index test1
     28 {
     29         #索引数据源
     30         source                  = src1
     31         #数据地址
     32         path                    = /usr/local/csft4/var/data/test1
     33         docinfo                 = extern
     34         charset_type            = zh_cn.utf-8
     35         #中文分词配置
     36         #BSD、Linux环境下设置,/符号结尾
     37         charset_dictpath = /usr/local/mmseg4/etc/
     38 }


服务端的配置 (均能自定义)
     61 searchd
     62 {
     63         listen                  = 9312
     64         listen                  = 9306:mysql41
     65         log                     = /usr/local/csft4/var/log/searchd.log  --日志文件目录
     66         query_log               = /usr/local/csft4/var/log/query.log  ---查询日志
     67         read_timeout            = 5
     68         max_children            = 30
     69         pid_file                = /usr/local/csft4/var/log/searchd.pid    --pid文件目录
     70         max_matches             = 1000
     71         seamless_rotate         = 1
     72         preopen_indexes         = 1
     73         unlink_old              = 1
     74         workers                 = threads # for RT to work
     75 }


然后进入 MySQL 查看 client - connection - server - results 四项的编码,需要保持一致,以下 coreseek 的配置也要保持编码一致:

mysql> show variables like 'character_set_%';
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | utf8                             |
| character_set_connection | utf8                             |
| character_set_database   | utf8                             |
| character_set_filesystem | binary                           |
| character_set_results    | utf8                             |
| character_set_server     | utf8                             |
| character_set_system     | utf8                             |
| character_sets_dir       | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.01 sec)

这里使用的 utf8 编码,如果你使用的 gbk 编码,可能需要额外转换你的 mmseg 分词词库为 gbk 了。


经过以上步骤如果都没错误则可进行生成索引数据进行测试


新建了数据库 text_sph
新建了数据表 documents
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| title   | varchar(500) | YES  |     | NULL    |                |
| content | varchar(500) | YES  |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+

插入数据:insert into documents values(1,'今天又要下雨了,下班就回家吧','预计当前至20时,房山区将出现分散性雷阵雨天气,有雷电活动,局地短时雨强较大,并伴有短时大风和小冰雹请注 意防');

生成索引:

./usr/local/csft4/bin/indexer --all

Coreseek Fulltext 4.1 [ Sphinx 2.0.2-dev (r2922)]
Copyright (c) 2007-2011,
Beijing Choice Software Technologies Inc (http://www.coreseek.com)

 using config file '/usr/local/csft4/etc/csft.conf'...
indexing index 'test1'...
WARNING: attribute 'group_id' not found - IGNORING
WARNING: attribute 'date_added' not found - IGNORING
WARNING: Attribute count is 0: switching to none docinfo
collected 1 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 1 docs, 198 bytes
total 0.540 sec, 366 bytes/sec, 1.85 docs/sec
skipping non-plain index 'testrt'...
total 2 reads, 0.000 sec, 0.2 kb/call avg, 0.0 msec/call avg
total 6 writes, 0.000 sec, 0.2 kb/call avg, 0.0 msec/call avg

查询测试:

./usr/local/csft4/bin/search '下雨'

Coreseek Fulltext 4.1 [ Sphinx 2.0.2-dev (r2922)]
Copyright (c) 2007-2011,
Beijing Choice Software Technologies Inc (http://www.coreseek.com)

 using config file '/usr/local/csft4/etc/csft.conf'...
index 'test1': query '下雨 ': returned 1 matches of 1 total in 0.000 sec

displaying matches:
1. document=1, weight=1500
    id=1
    title=???????,??????
    content=?????20???????????????????????????????????????????????

words:
1. '下雨': 1 documents, 1 hits

index 'testrt': search error: failed to open /usr/local/csft4/var/data/testrt.sph: No such file or directory.


至此,coreseek安装成功并成功测试,下一篇将设置php配合coreseek
阅读全文
0 0