在中国最大的教育资源门户网站两年期间, 黄药师负责学科网搜吧的设计与开发…正好赶上了公司飞速发展的阶段.. 作为专注于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. swoole 异步非堵塞 server/端 client/端 代码,已经测试完毕。贴代码

    服务器环境  centos7.0  swoole4.3 php7.2 pcre4.8  nginx1.8   php-fpm server.php <?php class Server { pr ...

  2. 如何为SpringBoot服务添加HTTPS证书

    HTTPS是HTTP的安全版本,旨在提供数据传输层安全性(TLS).当你的应用不使用HTTP协议的时候,浏览器地址栏就会出现一个不安全的提示.HTTPS加密每个数据包以安全方式进行传输,并保护敏感数据 ...

  3. 使用 ALSAlib 播放 wav

    在 ARM 2440 开发板上正常播放 16bit  44100 采样率的wav , 为了程序简单,没有判断返回值. 补充,在 ubunto 上也能正常播放. 编译方法: arm-linux-gcc ...

  4. git删除已经提交的包含敏感信息的文件(还没提交到远程仓库)

    写好的代码已经提交了(但还没push到github),发现某个文件里包含密码.如果push的话,密码可就被公开了.如果在代码里改掉密码,再commit一次,也不行,历史提交记录还是会上传到github ...

  5. C语言二进制拼接 (整数和byte类型的字符串拼接)

    #include <iostream>#include <cstring>#include <cstdio> using namespace std; typede ...

  6. 免费开源的 HelloDjango 系列教程,结束还是开始?

    作者:HelloGitHub-追梦人物 我们已经成功地开发了一个功能比较完备的个人博客,是时候来总结一下我们的工作了.博客系列完整的源代码地址: https://github.com/HelloGit ...

  7. 当AI遇上K8S:使用Rancher安装机器学习必备工具JupyterHub

    Jupyter Notebook是用于科学数据分析的利器,JupyterHub可以在服务器环境下为多个用户托管Jupyter运行环境.本文将详细介绍如何使用Rancher安装JupyterHub来为数 ...

  8. 记一次nor flash固件烧录速度优化

    背景 某个方案使用的是spinor作为存储介质,每次烧录新固件都耗时数分钟,为了提高效率,需要对其进行优化. 分析流程 基本流程 当前烧录流程,有一个可选步骤,全盘擦除,这个步骤耗时达数分钟.不过这是 ...

  9. ILspy不能查看VS代码问题

    1.问题情况 刚接触IL,发现从网上下载的IL无法反编译 dll和exe文件都不行 出现如下提示: System.OutOfMemoryException: 数组维度超过了支持的范围. 2.解决方法 ...

  10. 金三银四,还在为spring源码发愁吗?bean生命周期,看了这篇就够了

    第一,这绝对是一个面试高频题. 比第一还重要的第二,这绝对是一个让人爱恨交加的面试题.为什么这么说?我觉得可以从三个方面来说: 先说会不会.看过源码的人,这个不难:没看过源码的人,无论是学.硬背.还是 ...