Coreseek搭建的社工库中@特殊字符的搜索

2015.12.27补充:经过测试发现可以实现,但是出现另一个问题,搜索test@163.com全匹配没有问题了,但是搜索test无法匹配test@163.com了。这个问题暂时无解。

搜索引擎目前对这种搜索也是在@处断开进行搜索的。

coreseeksearch


————————————————————————————————

目前有两种思路:

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

http://segmentfault.com/q/1010000000229258

http://www.coreseek.cn/forum/2_922_0.html