sphinx 中缀索引配置,实现类似like的搜索

这一段时间来一直在跟sphinx打交道,其间或多或少遇到一些问题,其中让我费时最多的莫过于模糊搜索。

用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
}

正如手册上所说的

中缀索引会使索引体积急剧增大(因为待索引关键字增多了很多)

不过由于还是可以使用词库进行搜索,所以保证了大多数的速度和精确性,并提高了模糊搜索的智能性。

转自: https://blog.csdn.net/xiweiwei/article/details/8281640

猜你喜欢

转载自blog.csdn.net/wuzuyu365/article/details/89239332