关于k12领域Lucene.net+pangu搜索引擎设计开发的一些回顾
在中国最大的教育资源门户网站两年期间, 黄药师负责学科网搜吧的设计与开发…正好赶上了公司飞速发展的阶段.. 作为专注于k12领域内容与服务的互联网公司的一员,同时整个公司又在积极提升用户体验的氛围中,黄药师对自己的工作感到责任重大,并为之激动不已,工作时自然百倍投入..
闲话先说到这里了^^,如果有兴趣,可以关注一下黄药师的微信公众号: e尚派 .以后会和大家一起探讨..也很期待一起交流,共同成长…另外本文假设读者您已经对Lucene有了基本的了解,具体到笔者自己,用的是lucene.net 3.0.2+盘古分词器组件..
刚接手时, 搜索引擎已经可以跑起来,但是搜索结果并不理想…我们都知道搜索引擎里面搜索结果的查准率和查全率是两个重要的指标…但搜索引擎作为一个门户网站的重要组成部分,其地位和意义如人的动脉血管一样… 试想一下,我们的教师和学生用户在网站上通过点击栏目版块,以及版块列表页分页查找….那会是一个多么让人无法忍受的事情…
毫无疑问,我们要解决问题概括起来就是:在平台千万用户积累近10多年的教学资料里面..如何让用户快速找到自己想要并且相对比较新的资料呢 ?
我们知道要做好lucene全文检索,首先要对倒排表结构和评分机制要有基本的了解..在此基础上我们所做的优化改进处理才不会偏离方向..
A.用户搜索过程查全率不高甚至出现没有结果,常见的原因汇总起来有:
- 跨站get请求内容编码问题//乱码了,有结果才怪..
- 分词错误// “去年初中”如果分词为”年初”就有问题了.
- 数字类问题 //编辑上传”..1月..”,用户搜索 “一月”
- 拼音问题 //百度的习惯,用户会用拼音来检索,如果没有处理就悲剧了
- 错别字问题 //用户搜索”七年级其中考试”,其实要”七年级期中考试”
- 公式问题 //用户搜索数理化公式时,部分字符被当停用词..
- 缺域转换处理//搜索免费的资料,应等效于资料价格属性=0,不管标题是否体现
- 缺简繁体处理//台湾,香港地区的用户会用繁体检索…没处理就悲剧了..
- 缺乏语义处理.//module1,模块一,模块1,module one,module1-2…不能硬匹配..
- 简写缩写 //”11-14年理(数)高二下”就是”2011-2014年理科数学高二下册”
- 文章摘要问题 //用作索引的信息,如果本身不能体现资料,则很难被搜索到…
- 查询策略不是最优 //查询策略不优秀,很多功夫都会前功尽弃
- 缺人工智能 //用户搜索”告诉我,到哪里得到下载积分,我很急”,我想人工回答^^..
…….此处还有很多…黄药师的一个感觉就是:很多东西不是某一个算法就能解决的,我们需要在运营中不断研究用户的搜索日志,不断找出高频率的问题,解决了,我们就会一个提高和进步….也就是前辈经常说的“好的产品不是开发出来的,而是运营出来的”
B.用户搜索过程中查准率不高的常见原因汇总起来有:
- 分词歧义 //”2014年初中考试”可能会分为“2014,年初,中考”意义不对..
- 排序方式不对//如果最优的结果没有排在最前面,用户会觉得不准确…
- 同上述A中影响查全率中的因素..
既然原因大家都有一定的了解了, 下面,黄药师就几个重要的问题和大家做一下分享:
1) 如何突破现有第三方中文分词的局限性?
首先,盘古分词器是一个优秀,并且很亲民的中文分词器组件,它的分词效果,总体上兼顾了质量和性能…盘古的作者也有预见性的为我们提供了一个自定义处理接口(ICustomRule).. 在日常开发过程之中,本人也经常与之打交道…至于原因,读者童鞋可以回顾一下我们上面讲的,导致查全率和查准率不好的常见原因^^..
至于怎么做,我们很显然可以根据对搜索日志的统计,观察, 先从最常见,频次最高的问题着手,因为解决了它们,往往能收到立竿见影的效果…我们看过盘古分词组件的童鞋应该知道,盘古分词器分词结束之后,分词结果是以双向链表的形式存储着..我们要做的就是针对上下文,确定需要怎么调整双向链表上的结点… 举例说明:对于”一月”,”元月”,”1月”这种不同形式,同种语义的,我们可以进行归一化,也就是无论用户上传时写的是其中的任何一种,其他用户搜索时,用其中任何一种搜索习惯都可以检索出所有的结果…原理参考倒排表…
2) 如何设置排序策略?
不同的场景,往往需要不同的排序策略….尤其是遇到第一排序,第二排序维度的时候甚至更多….. 而需要我们注意的是,涉及相似度评分的排序,我们需要关注Similary这个类,更准确地说是要理解lucene评分公式…因为什么时候考虑匹配的关键词的个数,什么时候考虑词的位置,间隔,倒包含频率…什么时候考虑权重…这些都直接影响了后面的系列优化…
3) 如何有效提高查准率?
通过设计一些工具,首先汇总和找出用户不满意的(搜索不准确)的搜索文本,这样我们就可以有针对性的着手优化..在解决了上述列出来的问题之后,我们在查询时也需要着重考虑..因为如果你用过多的must (boolean查询),则无结果率大量增加,如果用过多的shuold,则排序讲面临巨大的挑战….并且我们的用户要求准确地,并且是较为新的资料…这时候考虑的因素就更多,因此一个综合一点的办法就是,我们可以通过某种机制,动态的判断某些term在 query中是重要的,对重要的,进行boolean must查询,对于不重要的则进行相似度或查询… 因为这样我们可以既保证结果不至于太偏离主题,又让用户看到的结果记录数很多(提高了查全率)..
4) 如何解决多维度分组统计的问题?
处理该问题的过程中,如果你用的是java 版本的lucene,则应该有官方推荐的办法,但用lucene.net则需要自己做一些处理,因为官方并没有将最新的java版本移植到.net版本…
其实这个问题,我们也有办法,我们先自己想一下,对于分组统计,我们的lucene检索过程和sqlserver不一样的地方在于,lucene是开源的,我们在它的collect document的过程中,可以进行汇总统计..思路很简单,但是出于性能考虑,我们又要用到lucene内部提供的field缓存,这样我们也不需要从磁盘上进行加载处理,那样代价确实太高了..
5) 如何提高用户的搜索体验?
用户的搜索体验是无穷无尽的,只要产品还在运营中我们就会发现我们还有很多事情需要去处理…
最基本的,我们的用户中老中青都有,另外天南海北,学生老师家长都有 …用户的搜索习惯和水平也千差万别…而我们要做的就是尽可能的做到简单,百度有一句话说的好,就是:简单,可依赖…具体的做法,当聪明的您看到了黄药师上面列出的常见原因,应该就有方向了,对不….
如果您想和黄药师有更多的交流,希望您能拿起您的手机关注:e尚派 .或者加入到e尚派官方群: 378053304
关于k12领域Lucene.net+pangu搜索引擎设计开发的一些回顾的更多相关文章
- 8 个基于 Lucene 的开源搜索引擎推荐
Lucene是一种功能强大且被广泛使用的搜索引擎,以下列出了8种基于Lucene的搜索引擎,你可以想象它们有多么强大. 1. Apache Solr Solr 是一个高性能,采用Java5开发,基于L ...
- C#编写了一个基于Lucene.Net的搜索引擎查询通用工具类:SearchEngineUtil
最近由于工作原因,一直忙于公司的各种项目(大部份都是基于spring cloud的微服务项目),故有一段时间没有与大家分享总结最近的技术研究成果的,其实最近我一直在不断的深入研究学习Spring.Sp ...
- 基于特定领域国土GIS应用框架设计及应用
基于特定领域国土GIS应用框架 设计及应用 何仕国 2012年8月16日 摘要: 本文首先讲述了什么是框架和特定领域框架,以及与国土GIS 这个特定领 ...
- 驱动领域DDD的微服务设计和开发实战
你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案. 本文是基于 DDD 的微服务设计和开发实战篇,通过借鉴 ...
- 【搜索引擎Jediael开发笔记1】搜索引擎初步介绍及网络爬虫
详细可参考 (1)书箱:<这就是搜索引擎><自己动手写网络爬虫><解密搜索引擎打桩实践> (2)[搜索引擎基础知识1]搜索引擎的技术架构 (3)[搜索引擎基础知识2 ...
- 以DDD为开发模式的设计开发步骤可以是
以DDD为开发模式的设计开发步骤可以是:1)分析需求:2)画出用例图,系统中各个角色如何使用系统,也包括外部系统如何使用系统,也包括系统中到某个时间点自动启动的某些功能(此时角色就是时间):3)针对各 ...
- Lucene.Net 2.3.1开发介绍 —— 四、搜索(一)
原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(一) 既然是内容筛选,或者说是搜索引擎,有索引,必然要有搜索.搜索虽然与索引有关,那也只是与索引后的文件有关,和索引的程序是无关的,因此 ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(七)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(七) 5.IndexWriter 索引这部分最后讲的是IndexWriter.如果说前面提到的都是数据的结构,那么IndexWriter ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(五) 话接上篇,继续来说权重对排序的影响.从上面的4个测试,只能说是有个直观的理解了.“哦,是!调整权重是能影响排序了,但是好像没办法来 ...
随机推荐
- 原型模式故事链(3)--JS的数据类型、以及区别、区分、转化
上一章--原型链讲解:传送门:https://segmentfault.com/a/11... 在上一章讲解原型链时提到了:所有的引用类型都有一个_proto_属性,称之为隐式原型.那么引用类型是什么 ...
- fsLayuiPlugin联动表格使用(一)
简单联动表格使用 点击主表格,加载副表格数据, 演示地址:http://fslayuiplugin.fallsea.com/views/linkageDatagrid/index.html 联动表格配 ...
- 前端每日实战:92# 视频演示如何用纯 CSS 创作一颗逼真的土星
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/EpbaQX 可交互视频 此视频是可 ...
- 基础JavaScript练习(一)总结
任务目的 在上一任务基础上继续JavaScript的体验 接触一下JavaScript中的高级选择器 学习JavaScript中的数组对象遍历.读写.排序等操作 学习简单的字符串处理操作 任务描述 参 ...
- 大厂常问iOS面试题--多线程篇
1.进程与线程 进程: 1.进程是一个具有一定独立功能的程序关于某次数据集合的一次运行活动,它是操作系统分配资源的基本单元. 2.进程是指在系统中正在运行的一个应用程序,就是一段程序的执行过程,我们可 ...
- Keras深度神经网络算法模型构建【输入层、卷积层、池化层】
一.输入层 1.用途 构建深度神经网络输入层,确定输入数据的类型和样式. 2.应用代码 input_data = Input(name='the_input', shape=(1600, 200, 1 ...
- leetcode 209 3 滑动窗口
class Solution { public: int minSubArrayLen(int s, vector<int>& nums) { ,r=-; //由于数组是[]区间, ...
- 【Java必修课】判断String是否包含子串的四种方法及性能对比
1 简介 判断一个字符串是否包含某个特定子串是常见的场景,比如判断一篇文章是否包含敏感词汇.判断日志是否有ERROR信息等.本文将介绍四种方法并进行性能测试. 2 四种方法 2.1 JDK原生方法St ...
- 7,MapReduce基础
目录 MapReduce基础 一.关于MapReduce 二.MapReduce的优缺点 三.MapReduce的执行流程 四.编写MapReduce程序 五.MapReduce的主要执行流程 Map ...
- vue中moment.js的使用
一.介绍 moment.js是一款现在对时间处理的强大的函数. Moment被设计用于在浏览器和Node.js中工作. 目前ci系统使用的浏览器有:IE8.IE9在Windows 7上.Chrome在 ...