如何采用 coreseek(sphinx) 搭建搜索系统

coreseek 实战总结

该文章包含以下内容:

  • coreseek 的典型架构
  • 实时性解决方案
  • mmseg 分词使用经验
  • 同义词使用经验
  • 后继目标

coreseek 的典型架构

coreseek 的典型结构,就是通过增量索引来满足近似实时性,对于新增的记录无法及时搜索可见。对于搜索系统存在的记录,非字符串字段的更新,我们一般是调用update方法进行更新。如果搜索引擎要返回业务的其他字段,这时字段的实时性是要求准实时的。这种情况在典型架构下,是可以解决的,图1所示就是当前的典型架构。
如何采用 coreseek(sphinx) 搭建搜索系统_第1张图片

图1
这个方案在实时性有一定的缺陷,满足实时不高的业务。但是如果要求搜索引擎返回其他的业务字段,最好根据搜索结果中的DOCID再去查询K-V存储系统。

实时性解决方案

如果对于新增的结果,要在较短的延迟内可以搜索到,这时如果不采用SPHINX的RT模式,得想其他方案。但是在当前的coreseek 版本中RT模式不是很成熟、不是很稳定。但是如果采用最新版本的sphinx,又没有中文分词支持,所以在当前的典型架构下,得加个小系统,采用搜索结果合并的方式。
图2所示就是这样的系统架构。
如何采用 coreseek(sphinx) 搭建搜索系统_第2张图片

图2
当然,我们也可以采用Elastic search。这里业务记录更新到加速DB中间可以加个MSQ进行异步、解耦,消息队列失败,无需做对账,因为后继的增量索引就相当于对账。

mmseg 分词使用经验

mmseg 使用的使用经验:
添加词库,但是要添加哪些词,是有讲究的。个人的使用经验,不要添加长度超过5的中文词,一来coreseek 里面默认的词长就是5,二来词长超过5的,可以拆成独立的词,然后再组合,而且经过多次词库调整经验:分词小于的切分准确度比较高,只是个人经验。

同义词使用经验

coreseek 中同义词貌似不是支持得很好,后来我是通过修改源码:在建立索引的时候,通过关键词去获取该关键词的同义词,并进行索引,有需要源码的可以联系我。
这里讲一下同意词的使用经验:
- 搜同一类型的商品
假如我们要搜尿不湿的商品,尿不湿其实就是纸尿裤。但是我们的商品名称没有出现尿不湿。这时就可以在mmseg 中添加同义词:
纸尿裤
—尿不湿,
-一些品牌的简称
有些品牌用户喜欢简称来搜,比如商品品牌是艾维诺。但是用户有可能使用维诺来搜。
如果我们把艾维诺这个关键词加入词库,那么用户采用维诺估计是不会搜到。如果艾维诺不在词库,建立索引的时候会切分成:艾|维|诺。那么用户搜索的关键词维诺,如果没有在关键词中,也会切分成:|维|诺。这时搜索是可以搜到的。如果两者有一方在词库中,那么必须把另外一方也假如词库。
然后增加同义词:
艾维诺
—维诺,

后继

可以尝试将coreseek的中文分词添加到最新版本中,采用RT模式。

你可能感兴趣的:(技术共享)