安装
安装并不困难,这几天我反复装了十几次,关键是debian系统会有点奇怪的问题。
mmseg编译错误。解决办法是按编译错误提示,在出错的相关文件加入#include <string.h>。
有src/css/UnigramCorpusReader.cpp 以及 安装完成之后是mmseg/include/mmseg/freelist.h
另外,debian系统安装需要预先安装bison, byacc。
参考:http://www.sunnyu.com/?p=85
乱码
sphinx支持中文,需要把mysql数据库弄成utf8。
我在这里碰到了很奇怪的问题。首先强叔分给的系统是gbk的,在mysql创建utf8的表,set names utf8之后,在终端插入数据是乱码的。
雷师傅给出提示,set names gbk之后进行插入数据,再查出来是正常的。雷师傅这个处理是符合逻辑,系统输入的是gbk编码,所以使用mysql client必须要用gbk。然后mysql自己会根据表的编码转换过去。
不过,我在另外一台数据库,先执行set names utf8,再插入数据,数据也是正常的。看起来好像怎么搞都靠谱,不过差别在于系统编码。执行locale命令,系统如果是
LANG=en_US.UTF-8
LC_CTYPE=”en_US.UTF-8″
LC_NUMERIC=”en_US.UTF-8″
LC_TIME=”en_US.UTF-8″
LC_COLLATE=”en_US.UTF-8″
LC_MONETARY=”en_US.UTF-8″
LC_MESSAGES=”en_US.UTF-8″
LC_PAPER=”en_US.UTF-8″
LC_NAME=”en_US.UTF-8″
LC_ADDRESS=”en_US.UTF-8″
LC_TELEPHONE=”en_US.UTF-8″
LC_MEASUREMENT=”en_US.UTF-8″
LC_IDENTIFICATION=”en_US.UTF-8″
LC_ALL=
这样,mysql client使用utf8就可以了,不需要用gbk输入再转换到utf8。
光这样理解是没问题,执行起来依然不行的,先要把系统弄成utf8
终端也要如此,不然无法输入中文:

我先前使用的secure shell client,终端编码+数据库编码+系统编码,三重忽悠,彻底把我搞晕菜了。
这下把所有编码都整成utf8,sphinx果然能搜索出中文来了。
分词
sphinx不加入词典,也能用,搜索匹配还比较随意,比如“黄师傅”,用“黄师”也能搜到,不过不能用OR去多个词匹配了,系统总是用AND去解决多个条件。
用条件 “广州|澳洲”去检索,系统会拆成每个字,合并起来的结果却不是“广州”和“澳洲”之和。
words:
1. ‘澳’: 4176 documents, 11755 hits
2. ‘洲’: 7609 documents, 10952 hits
3. ‘广’: 42034 documents, 305350 hits
4. ‘州’: 33648 documents, 151677 hits
解决办法还是要生产词典给sphinx。到mmseg的安装目录下的data目录,执行:
mmseg -u unigram.txt
cp unigram.txt.uni /home/sphinx/uni.lib
再修改sphinx的配置加入:
charset_dictpath=/home/sphinx/
重新索引一遍,貌似速度提高一倍。
结果有了变化:
index ‘ptest’: query ‘广州|澳洲 ‘: returned 1000 matches of 13359 total in 0.017 sec
words:
1. ‘广州’: 13336 documents, 28893 hits
2. ‘澳洲’: 25 documents, 29 hits
新词
新词的问题总是要面对的,mmseg自带词库是不能满足实际应用要求,尤其是互联网每天都在不停诞生新的词汇。
修改unigram.txt文件,每个词定义为两行,第一行为词项,其格式为:[词条]\t[词频率],第二行是x:1
我开始被\t忽悠了,以为是个空格,加了几百个新词进去发现无效,换为\t做间隔之后就ok了。
疑点
雷蒙叔的建议,写段java程序用utf8连接去查询看是不是乱码,结果他是对的,client用gbk录入,utf8表里面的数据是正确的。不过,mysql+sphinx的查询却只有英文能用,如果数据编码正确,sphinx索引也应该正确。
我怀疑sphinx索引的时候,虽然在配置里面设置了utf8,还是跟系统编码有关系。
难点
难免要做一些奇怪的应用,比如400个关键字一次扔进去做全文检索。
目前看来,sphinx默认只支持10个关键字的条件。
update:2010.1.29
不过通过修改sphinx-0.9.8-rc2/src/sphinx.h的SPH_MAX_QUERY_WORDS,可以支持更多关键字,我改为500. 这个问题在0.99版本以后貌似是没有了。
另外还有个问题,英文和中文搭配的词,虽然加入了词库,不过测试看来没被承认。
例如:g党
分词出来变成“g” ,“党”了,失望。
update:2010.1.29
这个问题是mmseg引起的,跟sphinx无关,需要修改配置mmseg.ini,指定merge_number_and_ascii=1;
不过这个问题无解,自己安装的sphinx+mmseg找不到mmseg.ini,可以到coreseek官网下载安装coreseek,省却一大堆问题,。
近期评论