背景:
默认使用es做检索服务时 只是针对某个字段做检索,传入关键词调用检索服务,检索过程中ES分词部分我们无法控制细节和逻辑,从而影响检索效果,以下我给出简单策略供同学们扩展自己业务的思路。
ES使用IK分词,支持 ik_smart/ik_max_word两种分词方式,
在建立索引时使用ik_max_word最细粒度分词,原因是分尽量多的term增加召回匹配文档量,
在检索时使用ik_smart粗粒度分词,原因是减少term增加检索速度和召回的准确性,配置可以在mapping中使用"search_analyzer": "my_analyzer"进行检索分词配置。
在检索时指定相应字段后由ES执行分词并进行检索,但这一步骤由ES的分词器控制。
这种方式比较模式化:
1)会出现分词不完整 分出单字词时并用and方式检索可能会出现无结果的显现。
2)分词无权重无法加权提升相关度。
3)对检索关键词无法做逻辑处理,如业务重要词and非业务重要or的关系。
针对以上等问题修改IK分词器,增加20种业务词库和单字词库。扩展分词器请看我另一篇文章:https://blog.csdn.net/qqwwssaagg/article/details/107581850
组合策略:
输入:搜索框关键词
检索逻辑:
1)判断 省/市词并丢弃。(后续可以考虑改变城市筛选条件或提示引导)。
2)识别 小区/办公园区/办公楼/同义词 修改boost值为2.0F,AND外部方式组合检索相关字段。
3)识别 区/区县/地铁线/地铁站 修改boost值为1.8F,AND外部方式组合检索相关字段。
4)识别 房源标签/装修风格 修改boost值为1.5F,AND外部方式组合检索相关字段。
5)识别 商场/超市/公园/医院/大学/中学/小学 修改boost值为1.2F,AND外部方式组合检索相关字段。
6)基础分词不修改boost值,多个词OR内部方式组合,AND外部方式组合,检索综合字段。
7)以上识别出来的带有类型的分词器,多个词OR内部方式组合,AND外部方式组合,检索综合字段。
8)分词如有单字,与前一个词以短语方式组合再参加组合Query。
索引逻辑:
1)综合字段使用ik_max_word_all(自定义 支持多个分词器 包括单字分词)进行分词。
2)其它字段保持不变。
如果喜欢搜索技术请关注我的公众号吧
每天会持续更新搜索相关技术