在中国最大的教育资源门户网站两年期间, 黄药师负责学科网搜吧的设计与开发…正好赶上了公司飞速发展的阶段.. 作为专注于k12领域内容与服务的互联网公司的一员,同时整个公司又在积极提升用户体验的氛围中,黄药师对自己的工作感到责任重大,并为之激动不已,工作时自然百倍投入..

闲话先说到这里了^^,如果有兴趣,可以关注一下黄药师的微信公众号: e尚派  .以后会和大家一起探讨..也很期待一起交流,共同成长…另外本文假设读者您已经对Lucene有了基本的了解,具体到笔者自己,用的是lucene.net 3.0.2+盘古分词器组件..

刚接手时, 搜索引擎已经可以跑起来,但是搜索结果并不理想…我们都知道搜索引擎里面搜索结果的查准率和查全率是两个重要的指标…但搜索引擎作为一个门户网站的重要组成部分,其地位和意义如人的动脉血管一样… 试想一下,我们的教师和学生用户在网站上通过点击栏目版块,以及版块列表页分页查找….那会是一个多么让人无法忍受的事情…

毫无疑问,我们要解决问题概括起来就是:在平台千万用户积累近10多年的教学资料里面..如何让用户快速找到自己想要并且相对比较新的资料呢 ?

我们知道要做好lucene全文检索,首先要对倒排表结构和评分机制要有基本的了解..在此基础上我们所做的优化改进处理才不会偏离方向..

    A.用户搜索过程查全率不高甚至出现没有结果,常见的原因汇总起来有

    1. 跨站get请求内容编码问题//乱码了,有结果才怪..
    2. 分词错误// “去年初中”如果分词为”年初”就有问题了.
    3. 数字类问题    //编辑上传”..1月..”,用户搜索 “一月”
    4. 拼音问题      //百度的习惯,用户会用拼音来检索,如果没有处理就悲剧了
    5. 错别字问题  //用户搜索”七年级其中考试”,其实要”七年级期中考试”
    6. 公式问题    //用户搜索数理化公式时,部分字符被当停用词..
    7. 缺域转换处理//搜索免费的资料,应等效于资料价格属性=0,不管标题是否体现
    8. 缺简繁体处理//台湾,香港地区的用户会用繁体检索…没处理就悲剧了..
    9. 缺乏语义处理.//module1,模块一,模块1,module one,module1-2…不能硬匹配..
    10. 简写缩写  //”11-14年理(数)高二下”就是”2011-2014年理科数学高二下册”
    11. 文章摘要问题  //用作索引的信息,如果本身不能体现资料,则很难被搜索到…
    12. 查询策略不是最优 //查询策略不优秀,很多功夫都会前功尽弃
    13. 缺人工智能 //用户搜索”告诉我,到哪里得到下载积分,我很急”,我想人工回答^^..

…….此处还有很多…黄药师的一个感觉就是:很多东西不是某一个算法就能解决的,我们需要在运营中不断研究用户的搜索日志,不断找出高频率的问题,解决了,我们就会一个提高和进步….也就是前辈经常说的“好的产品不是开发出来的,而是运营出来的”

    B.用户搜索过程中查准率不高的常见原因汇总起来有

    1. 分词歧义  //”2014年初中考试”可能会分为“2014,年初,中考”意义不对..
    2. 排序方式不对//如果最优的结果没有排在最前面,用户会觉得不准确…
    3. 同上述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搜索引擎设计开发的一些回顾的更多相关文章

  1. 8 个基于 Lucene 的开源搜索引擎推荐

    Lucene是一种功能强大且被广泛使用的搜索引擎,以下列出了8种基于Lucene的搜索引擎,你可以想象它们有多么强大. 1. Apache Solr Solr 是一个高性能,采用Java5开发,基于L ...

  2. C#编写了一个基于Lucene.Net的搜索引擎查询通用工具类:SearchEngineUtil

    最近由于工作原因,一直忙于公司的各种项目(大部份都是基于spring cloud的微服务项目),故有一段时间没有与大家分享总结最近的技术研究成果的,其实最近我一直在不断的深入研究学习Spring.Sp ...

  3. 基于特定领域国土GIS应用框架设计及应用

              基于特定领域国土GIS应用框架 设计及应用              何仕国 2012年8月16日   摘要: 本文首先讲述了什么是框架和特定领域框架,以及与国土GIS 这个特定领 ...

  4. 驱动领域DDD的微服务设计和开发实战

    你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案. 本文是基于 DDD 的微服务设计和开发实战篇,通过借鉴 ...

  5. 【搜索引擎Jediael开发笔记1】搜索引擎初步介绍及网络爬虫

    详细可参考 (1)书箱:<这就是搜索引擎><自己动手写网络爬虫><解密搜索引擎打桩实践> (2)[搜索引擎基础知识1]搜索引擎的技术架构 (3)[搜索引擎基础知识2 ...

  6. 以DDD为开发模式的设计开发步骤可以是

    以DDD为开发模式的设计开发步骤可以是:1)分析需求:2)画出用例图,系统中各个角色如何使用系统,也包括外部系统如何使用系统,也包括系统中到某个时间点自动启动的某些功能(此时角色就是时间):3)针对各 ...

  7. Lucene.Net 2.3.1开发介绍 —— 四、搜索(一)

    原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(一) 既然是内容筛选,或者说是搜索引擎,有索引,必然要有搜索.搜索虽然与索引有关,那也只是与索引后的文件有关,和索引的程序是无关的,因此 ...

  8. Lucene.Net 2.3.1开发介绍 —— 三、索引(七)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(七) 5.IndexWriter 索引这部分最后讲的是IndexWriter.如果说前面提到的都是数据的结构,那么IndexWriter ...

  9. Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(五) 话接上篇,继续来说权重对排序的影响.从上面的4个测试,只能说是有个直观的理解了.“哦,是!调整权重是能影响排序了,但是好像没办法来 ...

随机推荐

  1. CSS 实现元素较宽不能被完全展示时将其隐藏

    首发于本人的博客 varnull.cn 遇到一个需求,需要实现的样式是固定宽度的容器里一排显示若干个标签,数量不定,每个标签的长度也不定.当到了某个标签不能被完全展示下时则不显示.大致效果如下,标签只 ...

  2. 大型Java进阶专题(二) 软件架构设计原则(上)

    前言 ​ 今天开始我们专题的第一课了,也是我开始进阶学习的第一天,我们先从经典设计思想开始,看看大牛市如何写代码的,提升技术审美.提高核心竞争力.本章节参考资料书籍<Spring 5核心原理&g ...

  3. Linux基本操作及常用指令

    今天复习了下Linux的基本操作及常用指令,上学期大数据云计算课一直也在用linux系统还是比较熟悉的,并在centos6.7虚拟机上部署了前几天做的web项目,了解了Nginx的反向代理与负载均衡, ...

  4. 登录页面判断session退出登录清空session

    1 2 3 4 5 6 if(empty($_POST)){      $_SESSION = array();     if(isset($_COOKIE[session_name()])){    ...

  5. 【.net core】电商平台升级之微服务架构应用实战

    一.前言 这篇文章本来是继续分享IdentityServer4 的相关文章,由于之前有博友问我关于微服务相关的问题,我就先跳过IdentityServer4的分享,进行微服务相关的技术学习和分享.微服 ...

  6. C# Bitmap 转 Bytes数组

    首先是Bitmap 转 MemoryStream MemoryStream ms = new MemoryStream(); bitmap.save(ms, ImageFormat.Jpeg); ms ...

  7. 一步一步学习S-MSCKF(一)连续时间IMU误差状态运动模型

    1 IMU真实状态运动模型 状态向量: \(x_{I}=\left[{{_{G}^{I}{q(t)}}^{T},{b_{g}(t)}^{T},{^{G}v_{I}(t)}^{T},{b_{a}(t)} ...

  8. Journal of Proteome Research | Current understanding of human metaproteome association and modulation(人类宏蛋白质组研究近期综述)(解读人:李巧珍)

    文献名:Current understanding of human metaproteome association and modulation(人类宏蛋白质组研究近期综述) 期刊名:J Prot ...

  9. kubernetes 1.17.2结合ceph13.2.8 实现jenkins部署并用traefik2.1代理

    注:关于ceph.kubernetes集群的部署在此不声明,相信搜到本篇博文,你一定对ceph.kubernetes的部署环节手刃有余. 注:本篇博文牵扯到的技术点有:ceph.kubernetes. ...

  10. Web_Servlet—— Servlet生命周期

    第4章 Servlet生命周期(重要) 4.1 Servlet生命周期概述 1,应用程序中的对象不仅在空间上有层次结构的关系,在时间上也会因为处于程序运行过程中的不同阶段而表现出不同的状态和不同的行为 ...