下载CORESEEK软件包后,里面自带了中文分词软件包LibMMSeg。首先需要安装LibMMSeg 。下面所有操作都是在linux平台下。在LibMMSeg根目录下执行 ./configure && make && make install完成安装。默认安装目录在/usr/local/mmseg3。在/usr/local/mmseg/bin下可以之执行mmseg命令,有相应的参数查看分词效果。
Sphinx搜索一个比较变态的地方就是按最大匹配度搜索的。比如分词中有江都,江都市,我搜江都市,是搜索不出江都的,同样如果搜索江都,也搜索不出江都市。刚开始还以为自己分词库有问题,就修改分词。
Mmseg的分词库文档是unigam.txt,在/usr/local/mmseg/etc/下,按照格式修改相应的分词。
最后/usr/local/mmseg3/bin/mmseg –u unigram.txt
生成unigram.uni文件,重命名为uni.lib复制到sphinx安装目录下的dict文件下,并重建索引。
忙完了发现搜索还是没起作用,详细的看了coreseek的文档才知道需要建立同义词库。
同义词库不需要自己填写,可以根据分词库生成。
1. 处理unigram.txt生成同义词库文件
mmseg-3.2.13源代码/script/build_thesaurus.py unigram.txt > thesaurus.txt
thesaurus.txt文件的格式如下:
南京西路
-南京,西路,
张三丰
-太极宗师,武当祖师,
2. 生成同义词词典
mmseg -t thesaurus.txt
3. 将thesaurus.lib放到uni.lib同一目录
4. coreseek索引和搜索时,会自动进行复合分词处理
Ok,最后成功解决问题。不过感觉sphinx分词还是不成熟。
--------------------------------------------------------------------
如果用同义词方式解决的话,同义词库就会很大。今天试了另外一种方法,就是配置中级索引。
在配置文件也就是sphinx.conf中配置min_infix_len = 1。中缀索引是实现“start*”, “*end”, and “*middle*”等形式的通配符成为可能(通配符语法的细节请参考 enable_star 选项)。当最小中缀长度设置为正值,indexer除了对关键字本身还会对所有可能的中缀(即子字符串)做索引。太短的中缀(短于允许的最小长度)不会被索引。 例如,在min_infix_len=2设置下索引关键字“test”会导致产生6个索引项 "te", "es", "st", "tes", "est"等中缀和词本身。对此索引搜索“es”会得到包含“test”的文档,即使它并不包含“es”本身。然而,中缀索引会使索引体积急剧增大(因为待索引关键字增多了很多),而且索引和搜索的时间皆会恶化。 在中缀索引中没有自动的办法可以提高精确匹配(整个词完全匹配)的评分,但可以使用与 prefix indexes 选项中相同的技巧。
这样配置好后,输入江都能搜江都市的,反之却不能。查看了文档以及coreseek社区的讨论帖,发现要对搜索词进行预处理,也就是搜索词输入后在java程序中队搜索词进行相应的切分处理。比如搜索江都市,java程序中,@name (江都)|(江都市)。