关于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个测试,只能说是有个直观的理解了.“哦,是!调整权重是能影响排序了,但是好像没办法来 ...
随机推荐
- Java锁的理解
目录: 1.为什么要使用锁? 2.锁的类型? 1.为什么要使用锁? 通俗的说就是多个线程,也可以说多个方法同时对一个资源进行访问时,如果不加锁会造成线程安全问题.举例:比如有两张票,但是有5个人进来买 ...
- Resource interpreted as Stylesheet but transferred with MIME type text/html: css失效
异常信息: Resource interpreted as Stylesheet but transferred with MIME type text/html: 可能原因 过滤器或者某个地方对所有 ...
- 01 ORM框架概述
ORM概述 ORM(Object-Relational Mapping) 表示对象关系映射.在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中.只要有一套程序能够做到建立对象与数据库 ...
- 随着php7的发布我个人觉得有必要进行一下历史回顾和整理
先看下人尽皆知的发展历史: HP 继承自一个老的工程,名叫 PHP/FI.PHP/FI 在 1995 年由 Rasmus Lerdorf 创建,最初只是一套简单的 Perl 脚本,用来跟踪访问他主页的 ...
- MATLAB神经网络(2)之R练习
1. AMORE 1.1 newff newff(n.neurons, learning.rate.global, momentum.global, error.criterium, Stao, hi ...
- 快速排序--15--快排--LeetCode排序数组
排序数组 给定一个整数数组 nums,将该数组升序排列. 示例 1: 输入:[5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:[5,1,1,2,0,0] 输出:[0,0,1,1,2,5] ...
- 深入理解Java内存模型(摘)
--摘自 周志明<深入理解Java虚拟机> 转自 https://www.jianshu.com/p/15106e9c4bf3 深入理解Java内存模型(摘) java内存模型(Java ...
- void指针和数组指针之间的转换
由于void* 可以被任何指针赋值,所以以void*作为函数参数可以使得接口更容易接受不同类型的参数,不过需要注意的时,实际操作时还需要利用强制类型转换,将指针转换为原类型,否则在内存上会有问题. 一 ...
- Java-方法(新手)
//创建的一个类.public class zy1ri0319 { //公共静态的主方法. public static void main(String[] args){ //调用方法. zy1(); ...
- 推荐一款优秀的web自动化测工具
在业务使用的自动化测试工具很多.有开源的,有商业化的,各有各得特色,各有各得优点!下面我就介绍几个我用过的一款非常优秀的国产自动化测试工具.在现有的自动化软件当中,都是以元素的name.id.xpat ...