2015.12.27补充:经过测试发现可以实现,但是出现另一个问题,搜索test@163.com全匹配没有问题了,但是搜索test无法匹配test@163.com了。这个问题暂时无解。
搜索引擎目前对这种搜索也是在@处断开进行搜索的。
————————————————————————————————
目前有两种思路:
1、不使用中文分词,使用chareset_table。
根据 Coreseek中文分词核心配置 规定,使用中文分词的话charset_table必须注释掉,否则无法中文分词。考虑到社工库对于中文需求不大,所以可以考虑只使用Coreseek中的sphinx核心做全文索引,而不用中文分词(其实用sphinx来做就够了)。
2、索引前将@.等特殊字符变换为其它非特殊字符。
利用 wordforms:词形字典 功能,将需要处理的特殊字符进行变换,在conf文件里加入一行
wordforms = /usr/local/sphinx/data/wordforms.txt
wordforms.txt内容形如:
@ > at
然后生成索引,搞定。
按照手册上 exceptions:词汇特例处理 上讲的,也能解决,但是效率不如wordforms,就懒得测试了。
刚发现,中文分词不适用。PASS…… 中文分词参考 Coreseek MMSeg 分词法的文档。
摘录一段LibMMSeg文档
由于LibMMSeg是为Sphinx全文搜索引擎设计的,因此其内置了部分搜索引擎切分算法的特性,主要表现在对特殊短语的支持上。
在搜索引擎中,需要处理C++时,如果分词器中没有词组C++,则将被切分为C/x +/x +/x,在进一步的检索中,可能每个词会由于出现的过于频繁而被过滤掉,导致搜索的结果与C++相关度不高不说,也严重影响的全文搜索的速度。在LibMMSeg中,内置对特殊短语的支持。
其输入文件格式如下
// test commit
.net => dotnet
c# => csharp
c++ => cplusplus
其中左侧是待支持的特殊短语,右侧是左侧的特殊短语需要被转换为的短语。这一转换在分词前进行。
可以在行的开头加入'//'作为注释符号,发现符号'//'后,整行将被忽略。
特殊短语词库构造命令:
mmseg -b exceptions.txt
其中, 开关'-b'指示mmseg是要构造特殊短语词库;exceptions.txt是用户编辑的特殊短语转换规则。
该命令执行后,将在当前目录下产生一个名为"synonyms.dat"的文件,将该文件放在"uni.lib"同一目录下,分词系统将自动启动特殊短语转换功能。
注意:
1、在启用了该功能后,如果分词系统发现了一个特殊短语,将直接输出其在右侧对应的替换的值;
2、右侧被替换的值,请保证不会被分词器进行切分。(eg. C++ => C# 这个转换的意义不大,并且可能导致C++这个短语永远无法被检索到!)
构造exceptions.txt,内容如下:
@=>at
其他可以自行添加
然后使用mmseg -b exceptions.txt命令生成synonyms.dat。
参考:
http://blog.csdn.net/chamtianjiao/article/details/9767155
http://www.coreseek.cn/docs/coreseek_4.1-sphinx_2.0.1-beta.html#conf-charset-table
http://www.coreseek.cn/docs/coreseek_4.1-sphinx_2.0.1-beta.html#conf-exceptions
发表评论