最近在做网站的全文检索, 因为网站前端使用的是PHP, Java的效率不高, 资源消耗和维护成本都比较大, 所以排除掉了Lucence.
最开始考虑的是Sphinx.
有一个中文的Sphinx项目叫Coreseek, 最开始是用这个来做测试的. 按网站上说明的配置, 搭建过程也比较顺利, 但是有一个问题是, 找不到繁体的词库. 因为这个项目用的词库格式与普通词库的格式不一样, 还需要转换一下格式才能转换成词库文件. 这个项目里提供了一个叫mmseg的可执行文件做词库生成, 但是每次生成都报”error!!!”. 经过排查后发现在繁体中, 如果出现全角的数字后, 就会出现error, 咨询了这个项目的所有者, 做繁体的定制是要收费的.
然后找到了另一个同是sphinx的中文项目, 叫Sphinx-for-Chinese, 这个项目是在每个Sphinx的发行版中, 在sphinxutils.cpp中加入了一个新参数 chinese-dictionary, 在sphinx.cpp 中加入mmseg实现的分词算法, 除此外没有其他改动, 比较接近原始的sphinx程序. 它的词典是用mkdict.exe生成的, 词典就是规则的 word fq 格式, 直接用convertz转换简体至繁体, 也可以顺利生成词典. 有一个小小的缺憾是似乎不能设置复合分词, 例如”官方声明”会被作为单个词索引, 这样搜索”声明”时不会出现. 复合分词的冗余会带来磁盘消耗, 但是实际使用中还是需要有复合分词的支持.
最后是SCWS. 这个项目我在2008年的时候就已经注意过, 因为那时候我也在做phpbb3的搜索功能. phpbb是按分词/索引的形式构建的搜索, 和国内的论坛不一样. 因为是PHP的实现, 而且无词库所以只能用的二分法. SCWS的分词很好的弥补了这个缺陷, 但是因为要安装PHP扩展, 很多租用网站空间的站长无法使用.
似乎是去年下半年, hightman发布了基于SCWS的中文全文搜索套件xunsearch. 这将scws作为一个服务组件, 结合索引库的实现通过socket端口对外提供索引和查询的服务, 使得scws除了php扩展形式外又增加了新的应用. 和Sphinx不一样, scws需要使用php脚本作为构建索引和查询的接口, sphinx是自带的mysql客户端调用, 因此重建索引的速度较sphinx要慢, 但是在特征量的灵活性上要好一些. |