搜索存在的问题,及解决方案
问题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
现有同义词:
首都,国都,京都,都城,京城,上京,京师,京华,凤城,北京
上海,魔都,申城
四川,天府之国
建立索引,查询策略:
- 建立索引:使用了 ik_max_word+同义词 进行最细粒度分词,建立倒排索引;如:text中如果遇到“北京”,1.先得到同义词:“北京”,“京城”,“首都”;2.ik_max_word分词,“北京”,“京”;归入索引
- 查询:使用 ik_smart 粗粒度分词进行查询,如搜索“北京”时:分词为“北京”然后搜索,而不是分词成“北京”,“京”进行搜索
Tips:
ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;
ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。
还有那些可优化点
使用了 ik中文分词,和同义词功能后,基本完成了 关键词 匹配话题功能,可以得到比较相关的专题,但还存在以下问题:
1.搜索“北京”时,会出现类似于“太行深处,燕赵雄风”话题,而“北京”与其匹配度不是很高 ——————》定义专题 位置 属性
2.搜索出来的专题 排序问题:那些才是用户跟感兴趣的,或者与特定用户匹配度高的话题 ——————》定义点击率,展现率属性,进行排序,这里有个淘宝seo方案:http://www.e2dian.com/?p=18110
搜索其他建议
*搜索服务应该仅返回ID
*搜索每次返回的ID列表应该记录log,后续能进行效果评估
*同义词,需要对同义词库进行了解
*地名词库
*对结果需要好的衡量标准。badcase等