centos7下安装sphinx coreseek 并且自定义分词字典

centos7下安装sphinx coreseek

因为工作上需要,这边需要安装个coreseek本地复现一些线上问题。 以前一直认为coreseek是sphinx下单独的插件,类似es的ik分词器。在实际安装
中发现coreseek是基于sphinx上面套了一层并非插件,我记录下了自己安装coreseek的一些经历和自定义分词字典的步骤,都蛮简单的全是做记录吧。

sphinx 和 elasticsearch 选择

sphinx版本迭代更新慢 基本处于没人维护的状态,搜索和拆词方面相对 没elasticsearch 那么灵活。但是考虑到项目现状我们还是任然在使用sphinx,因为前期sphinx开销小,技术人员相对不用操作复杂的查询语法,个人更喜欢elasticsearch但是现状用sphinx更优,而且我博客的服务器也是因为贫穷只能配置 sphinx

安装

下载

1
2
3
4
wget http://files.opstool.com/man/coreseek-4.1-beta.tar.gz
tar -xzvf coreseek-4.1-beta.tar.gz
cd coreseek-4.1-beta

目录结构

1
2
3
4
5
6
coreseek-4.1-beta
├── csft-4.1 //主控
├── mmseg-3.2.14 //分词器
├── README.txt
└── testpack //拆词包

编译安装mmseg-3.2.14

1
2
3
4
cd mmseg-3.2.14
./configure --prefix=/usr/local/coreseek-4.1
make
make install

ps:如果出现C++ compiler cannot create executables 可以

1
yum install gcc gcc-c++ gcc-g77

ps:如果出现error: cannot find input file: src/Makefile.in可以

1
2
3
4
5
6
aclocal
libtoolize --force
automake --add-missing
autoconf
autoheader
make clean

安装csft-4.1-beta

1
2
3
4
5
6
7
8
9
10
11
12
cd csft-4.1

sh buildconf.sh #输出的warning信息可以忽略,如果出现error则需要解决

./configure \
--prefix=/usr/local/sphinx \
--without-unixodbc \
--with-mmseg \
--with-mmseg-includes=/usr/local/coreseek-4.1/include/mmseg/ \
--with-mmseg-libs==/usr/local/coreseek-4.1/lib/ \
--with-mysql

如果 出现 automake: warnings are treated as errors

1
2
3
4
5
vim configure.ac
13行 >>>
AM_INIT_AUTOMAKE([-Wall -Werror foreign]) 改为
AM_INIT_AUTOMAKE([-Wall foreign]) subdir-objects

继续编译

1
2
make
make install

如果出现 make[2]: *** [sphinxexpr.o] 错误 1

1
2
3
4
5
6
在 csft-4.1/src/sphinxexpr.cpp 文件中, 替换所有

T val = ExprEval ( this->m_pArg, tMatch );

T val = this->ExprEval ( this->m_pArg, tMatch );

目录介绍

coreseek目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
./coreseek
├── bin
│   ├── indexer //创建全文索引
│   ├── indextool
│   ├── search //简单的命令行测试程序
│   ├── searchd //守护进程服务
│   └── spelldump
├── etc
│   ├── example.sql //测试文件
│   ├── sphinx.conf //配置文件
│   ├── sphinx.conf.dist
│   └── sphinx-min.conf.dist
├── share
│   └── man
└── var
├── data //数据文件
└── log //日志

MMSeg 目录

1
2
3
4
5
6
7
8
9
10
11
12
coreseek-4.1
├── bin
│   └── mmseg //分词器
├── etc
│   ├── mmseg.ini //使用分词词库
│   ├── unigram.txt //词库的文本文件
│   └── uni.lib
├── include
│   └── mmseg
└── lib
├── libmmseg.a
└── libmmseg.la

配置

/usr/local/coreseek/etc加入sphinx.conf写入内容
详细的字段介绍需要对接文档,下方会给出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
source src1
{
type = mysql
sql_host = localhost
sql_user = root
sql_123 =
sql_db = blog
sql_query_pre= SET NAMES utf8

sql_query = \
SELECT id as cid,title,data FROM zjj_articles
sql_attr_uint = cid


sql_ranged_throttle = 0
}
source src1throttled : src1
{
sql_ranged_throttle = 100
}
index test1
{
source = src1
path = /usr/local/coreseek/var/data/test1
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
charset_type = zh_cn.utf-8
charset_dictpath = /usr/local/coreseek-4.1/etc/
html_strip = 0
}

indexer
{
mem_limit = 32M
}
searchd
{
listen = 9312

log = /usr/local/coreseek/var/log/searchd.log
query_log = /usr/local/coreseek/var/log/query.log
read_timeout = 5
client_timeout = 300
max_children = 30
pid_file = /usr/local/coreseek/var/log/searchd.pid
max_matches = 1000
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
mva_updates_pool = 1M
max_packet_size = 8M
max_filters = 256
max_filter_values = 4096
max_batch_queries = 32
}

启动

1.生成索引文件

1
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf --all --rotate option

2.启动服务器

1
/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/sphinx.conf

自定义字典

有的时候我们需要自定义词典,这时候就需要修改mmseg目录下的文件了。

1
2
3
4
5
6
7
/mmseg/etc

etc/
├── mmseg.ini
├── unigram.txt //未编译的词典
└── uni.lib //编译后的字典

我们先测试下 张俊杰是大帅哥 这个词组

张俊杰是大帅哥

可以看见分词结果没把 张俊杰 ,大帅哥,帅哥等词单独拆出来。我们自定义下词典

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1.备份已有文件
cp uni.lib uni.lib.pak

2.修改unigram.txt,加入(unigram.txt开始时候不能有x:1 否则会出现) `Segmentation fault (core dumped)`

张俊杰 1
x:1
大帅哥 1

3.生成字典
/usr/local/mmseg3/bin/mmseg -u /usr/local/mmseg3/etc/unigram.txt

4.替换掉字典
mv unigram.txt.uni uni.lib

测试了下不用重启Sphinx,顺利分词

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~