elasticsearch搜索 方案 浅析

搜索存在的问题,及解决方案

问题1:搜索“北京”:出现 title 为 “南京从一碗鸭血粉丝汤开始”相关的专题,而且此专题排在搜索结果的第3位;更甚的是“四川”,各种与“四”相关的专题出现

分析elasticsearch存储索引使用了倒排索引的方式,倒排索引会用到分词,elasticsearch默认的中文分词只是简单的汉字单字分开,如:北京分词分城了 “北”,“京”,而title为“南京从一碗鸭血粉丝汤开始”的专题中有许多的“京”字出现,所以会被匹配到,而且还在高位。因此定位到需要解决的问题就是分词,搜索“北京”时,希望分词就是“北京”,搜索“四川”时,希望结果就是“四川”,而不是“四”,“川”

倒排索引:https://www.elastic.co/guide/en/elasticsearch/guide/1.x/inverted-index.html

解决方案:查了下最近常用的分词工具,汉字分词在elasticsearch中比较流行的就是 IK Analysis,决定使用IK Analysis

IK Analysis:https://github.com/medcl/elasticsearch-analysis-ik


问题2:搜索“北京”,发现很多title为“首都”,”帝都“,这些词汇,而这些词汇其实与”北京“同义,因此应该与”北京“同等对待

解决方案:使用 elasticsearch 同义词解决方案,将”北京“,”帝都“,”首都“,这些定义为同义词,查询时同等对待;

elasticsearch同义词:https://www.elastic.co/guide/en/elasticsearch/guide/1.x/using-synonyms.html

ik结合elasticsearch:http://www.cnblogs.com/yjf512/p/4789239.html

现有同义词

首都,国都,京都,都城,京城,上京,京师,京华,凤城,北京

上海,魔都,申城

四川,天府之国



建立索引,查询策略:

  1. 建立索引:使用了 ik_max_word+同义词 进行最细粒度分词,建立倒排索引;如:text中如果遇到“北京”,1.先得到同义词:“北京”,“京城”,“首都”;2.ik_max_word分词,“北京”,“京”;归入索引
  2. 查询:使用 ik_smart 粗粒度分词进行查询,如搜索“北京”时:分词为“北京”然后搜索,而不是分词成“北京”,“京”进行搜索

Tips:

ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;

ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。

还有那些可优化点

使用了 ik中文分词,和同义词功能后,基本完成了 关键词 匹配话题功能,可以得到比较相关的专题,但还存在以下问题:

1.搜索“北京”时,会出现类似于“太行深处,燕赵雄风”话题,而“北京”与其匹配度不是很高  ——————》定义专题 位置 属性

2.搜索出来的专题 排序问题:那些才是用户跟感兴趣的,或者与特定用户匹配度高的话题 ——————》定义点击率,展现率属性,进行排序,这里有个淘宝seo方案:http://www.e2dian.com/?p=18110


搜索其他建议

*搜索服务应该仅返回ID
*搜索每次返回的ID列表应该记录log,后续能进行效果评估
*同义词,需要对同义词库进行了解
*地名词库
*对结果需要好的衡量标准。badcase等


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值