sphinx模拟like模糊搜索,使用前缀,中缀索引等来扩大分词的范围会使索引迅速膨胀,如添加一个中缀字符长度至少就增加了不少于3倍的索引,同样会影响搜索效率。
用sphinx做中文搜索时,大多会使用到mmseg做为分词工具,如’白下区KTV’分解成’白下区’ , ‘KTV’两个词。
一般只要词库里有的词都能高效的从索引里搜索到,但如果搜索’白下KTV’会被分解成’白’ , ‘下’ , ‘KTV’三个词,而词库中并没有前两个,类似的情况很多,想要短时间完善和丰富词库很困难,虽然通过搜狗的细胞词库,我已经搜集到所属行业的词约17万个。
于是我查找了大量似类情况别人的解决方案,其中coreseek(sphinx)官网提供了两个解决方案。
一元分词:
http://www.coreseek.cn/products-install/ngram_len_cjk/
同义词:
http://www.coreseek.cn/products-install/coreseek_mmseg_complex/
一元分词的特点是把每个单一的词做为一个分词,并且不使用词库检索,所索引会很大,查询开销会变大,而且享受不了词库所带来的精准性。
同义词我没有去试,我觉得不失为一个好的解决方案,不过我想词库过大对性能也会有一定的影响,而且我并不是使用mmseg的默认词库。
还有一种方法是开启enable_star=1,该方法的核心是使用通配符,这样我们在php里也要做个分词,而且我并没有测试成功(此法我不知道哪里是首发网站,所以不贴于网址)
通过查询手册我采用以下方法,并且测试成功:
修改index配置,如下所示
enable_star=0 #不使用通配符,默认不启用,可以不写
min_infix_len=1 #使用中缀索引,并且最小索引为1,关于该项作用不知者可以查询手册
infix_fields=字段1,字段2 #因为中缀索引会使索引量急剧膨胀,所以最好选择你认为最主要的少量几个字段做中缀索引。
附上我的配置
index test { source = mysql path = /usr/local/coreseek/var/data/test1 docinfo = extern mlock = 0 morphology = none min_word_len = 1 html_strip = 1 charset_dictpath = /usr/local/mmseg3/etc/ charset_type = zh_cn.utf-8 enable_star = 0 min_infix_len = 1 infix_fields = name,address }
正如手册上所说的
中缀索引会使索引体积急剧增大(因为待索引关键字增多了很多)
不过由于还是可以使用词库进行搜索,所以保证了大多数的速度和精确性,并提高了模糊搜索的智能性。