一、为什么需要搜索引擎

问题1:数据库索引的原理是怎样的?

  索引原理:对列值创建排序存储,数据结构={列值、行地址}。在有序数据列表中就可以利用二分查找快速找到要查找的行的地址,再根据地址直接取行数据。

问题2:索引的排序,是怎么排的?

  数值列

  时间列

  文本列

问题3:在新闻标题列上建索引,当我们查询 标题 = ‘钓鱼岛’,数据库会怎么去查? 而当我们查询 标题 LIKE ‘%钓鱼岛%’ ,数据库该如何去查?

  Like 时索引失效,全表扫描,数据量大时是噩梦。

问题4:在数据库中如何判断一个列是否可以建索引?

基本原则:

表经常被访问,且数据量很大,而每次查询的数据只占很小很小一部分

列的数据值分布范围广泛

列中包含大量空值

列被经常用在查询条件中(不能是包含在表达式中)

注意:文本列需特殊考虑:经常是用作模糊查询,则不适合建索引。精确查询则可。

问题5:如果要对查询出来的结果进行相关度排名,数据库能否做到?

如:要查询 苍老师、tony、火锅有关的新闻:

含有三个关键字(相关度最高)的新闻排前面

含两个关键字(相关度次之),排次之

含一个关键字 的,排次次之。

如果要对搜索的新闻字段设置不同的权重,比如新闻标题中包含这三个关键字的新闻的相关性就远高于新闻内容中包含这三个字。数据库能否做到?

  答案:做不到,这个时候就需要搜索引擎了

问题6:常见的数据结构有哪些?

结构化数据: 用表、字段表示的数据

半结构化数据:   xml 、html

非结构化数据: 文本、文档、图片、音频、视频等

经过前面的问题的讨论,得出为什么需要搜索引擎的结论:

  数据库适合结构化数据的精确查询,而不适合半结构化、非结构化数据的模糊查询及灵活搜索(特别是数据量大时),无法提供想要的实时性。

二、怎样建立反向索引

问题1:如何做才能快速查询到与苍老师有关的新闻?

分析:我们查询时,输入的是苍老师,想要得到标题或内容中包含“苍老师”的新闻列表。

如果标题、内容列上都有一个这样的索引,里面能快速找到与苍老师关键字对应的文章id,再根据文章id就可以快速找到文章了。

标题列索引:

内容列索引:

词到文章id的索引,这就是:反向索引(Inverted index)

问题2:问题1的标题列索引和内容列索引两个索引可以合并到一起,这样有什么好处?

合并得好处是:可以减少访问数据库的次数

问题3:反向索引的记录数会不会很大?如果是英文的,最大是多少?如果是中文的,最大可能是多少?

  英语单词的大致数量是10万个 汉字的总数已经超过了8万,而常用的只有3500字

  《现代汉语规范词典》比《现代汉语词典》收录的字和词数量更多。前者是13000多字,72000多词,后者是11000多字,69000多词

  结论:量不会很大,30万以内;通过这个索引找文章会很快

问题4:如何建立问题2中的这样一个反向索引?

数据示例:

新闻id:1

新闻标题:Tony 与苍老师一起吃火锅

新闻内容:2018年4月1日,Tony 在四川成都出席某活动时,碰巧主办方也邀请了苍老师来提高人气,在主办方的邀请下和苍老师一起吃了个火锅,很爽!

如果是英文文章,好不好分?

It’s one thing to find the 10 best documents to match your query

英文好分(有空格),中文则不好分。 但一定得要分,否则无法建立反向索引。

就必须写一套专门的程序来做这个事情:分词器

中文分词器原理:有个词的字典,对语句前后字进行组合,与字典匹配,歧义分析

问题5: java开源中文分词器有很多,如何选择?

  准确率、分词效率、中英文混合分词支持

常用中文分词器:

IKAnalyzer、mmseg4j

问题6: 你、我、他、的、地、了、标点符号…..这些需要为其创建索引吗?

这些词称为:停用词。分词器支持指定/添加停用词,不需要为其创建索引

问题7: 当出现了新词了,该怎么办?

  撩妹 老司机、软妹子、直男、腿玩年、苍老师

  分词器应支持为其词典添加新词。

总结:

根据分词结果,我们创建反向索引,如下所示:

三、有了反向索引了,如何进行搜索?

如想搜索与 “tony OR 苍老师” 相关的新闻,步骤是怎样的?

步骤1: 对搜索输入进行分词

tony 、苍老师

步骤2: 在反向索引中找出包含tony、苍老师的文章列表

步骤3: 合并两个列表,排序输出

  {1,12,8,5}

四、如何建立一个相关性评估模型?

利用出现次数来建立模型

规则1: 统计出现次数,根据次数从高到低排

{{1,5},{5,3},{12,1},{8,1}}:文章1出现5次,文章5出现3次,文章12出现1次,文章8出现1次

问题1:标题中出现苍老师,与新闻的内容中出现苍老师,哪个是专门写苍老师的相关度高些?怎么做

规则2: 加入权重,标题权重10,内容权重1,计算权重得分,按高-低排序

  {{1,23},{12,10},{5,3},{8,1}}

总结:利用出现次数来建立模型这个相关性模型很简单。有时排序会不是很准确。

复杂的相关性计算模型有:

tf-idf 词频-逆文档率模型

向量空间模型

贝叶斯概率模型,如: BM25

搜索引擎中会提供一种、或多种实现供选择使用,也会提供扩展。

电商网站中的搜索相关性计算会考虑更多,更复杂。

五、反向索引更新:数据更新时,索引是不是必须得更新?好更新吗?

更新情况分析:

问1:新增时,需要怎么更新?

问2:删除时,需要怎么更新?

问3:修改时,需要怎么更新?

六、反向索引是存储在内存中,还是磁盘中合适?

  大的放磁盘,小的放内存,同时需要做持久化

七、搜索引擎需要支持精确搜索吗?需要支持像数据库一样的多条件AND  OR 组合搜索吗?

  如 类别 IN () 数值 > = < 时间

  必须要,否则搜索引擎就没人用了

八、总结

1、搜索引擎是什么?

  一套可对大量结构化、半结构化数据、非结构化文本类数据进行实时搜索的专门软件

  最早应用于信息检索领域,经谷歌、百度等公司推出网页搜索而为大众广知。后又被各大电商网站采用来做网站的商品搜索。现广泛应用于各行业、互联网应用。是大型系统、网站架构师必备技能。

2、搜索引擎是用来解决什么问题的?

  专门解决大量结构化、半结构化数据、非结构化文本类数据的实时检索问题。 这种实时搜索数据库做不了。

3、搜索引擎适合什么场景使用?

  核心:大量结构化、半结构化、非结构化文本类数据的实时搜索

  信息检索(如电子图书馆、电子档案馆)

  网页搜索

  内容提供网站的内容搜索(如 新闻、论坛、博客网站)

  电子商务网站的商品搜索

  如果你负责的系统数据量大,通过数据库检索慢,可以考虑用搜索引擎来专门负责检索。

4、搜索引擎由哪些核心部件构成?

  数据源、分词器、反向索引(倒排索引)、相关性计算模型

5、搜索引擎的工作原理是怎样的?

  1、从数据源加载数据,分词、建立反向索引

  2、搜索时,对搜索输入进行分词,查找反向索引

  3、计算相关性,排序,输出

6、要实现一个搜索引擎,需要实现哪些?

  1、分词器

  2、反向索引,索引存储

  3、相关性计算模型

7、要去使用一个搜索引擎,需要搞清楚它的哪些方面?

  1、分词器

  2、反向索引建立、存储、更新

  3、相关性计算模型

8、java领域应用广泛的开源搜索引擎组件、系统

Lucene:Apache顶级开源项目,Lucene-core是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的框架,提供了完整的查询引擎和索引引擎,部分文本分词引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。

Nutch:Apache顶级开源项目,包含网络爬虫和搜索引擎(基于lucene)的系统(同百度、google)。Hadoop因它而生。

Solr:Lucene下的子项目,基于Lucene构建的独立的企业级开源搜索平台,一个服务。它提供了基于xml/JSON/http的api供外界访问,还有web管理界面。

Elasticsearch:基于Lucene的企业级分布式搜索平台,它对外提供restful-web接口,让程序员可以轻松、方便使用搜索平台,而不需要了解Lucene。

问题:如何选择搜索引擎组件或系统?

看成熟度,使用企业量。

Lucene系列一:搜索引擎核心理论相关推荐

  1. 【视频课】一课掌握模型设计核心理论与实战技巧

    课程介绍 模型的设计是整个深度学习领域的通用基础,不管是从头设计自己的神经网络,还是对已有模型进行优化获得更高的任务指标,更快的运行速度,获得更小的模型体积,都需要掌握各类网络的设计技巧,是深度学习算 ...

  2. Java 并发编程—核心理论

    原文作者:liuxiaopeng 原文地址:Java 并发编程:核心理论 目录 一.共享性 二.互斥性 三.原子性 四.可见性 五.有序性 六 总结 并发编程是Java程序员最重要的技能之一,也是最难 ...

  3. java并发数据共享机制_Java并发编程:核心理论之数据共享性

    原标题:Java并发编程:核心理论之数据共享性 并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能.它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰.思维缜密,这 ...

  4. 【java毕业设计】基于java+Lucene+Tomcat的搜索引擎设计与实现(毕业论文+程序源码)——搜索引擎

    基于java+Lucene+Tomcat的搜索引擎设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Lucene+Tomcat的搜索引擎设计与实现,文章末尾附有本毕业设计的论文和源 ...

  5. VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法]

    VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法] VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法] - tingya的专栏 - 博客频道 - CSDN.NET VI ...

  6. 【基于物理的渲染(PBR)白皮书】(二) PBR核心理论与渲染光学原理总结

            本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处           文章链接: https://zhuanlan.zhihu.com/p/56967462 这是[基于物理的 ...

  7. C#多线程学习(四) 多线程的自动管理(线程池) (转载系列)——继续搜索引擎研究...

    在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPo ...

  8. 【百家稷学】深度学习与计算机视觉核心理论与实践(中国地质大学实训)

    继续咱们百家稷学专题,本次是有三AI在中国地质大学进行的暑期课程教学.百家稷学专题的目标,是走进100所高校和企业进行学习与分享. 分享主题 本次分享是在中国地质大学机械与电子信息学院进行,主题是&l ...

  9. C#多线程学习(五) 多线程的自动管理(定时器) (转载系列)——继续搜索引擎研究...

    Timer类:设置一个定时器,定时执行用户指定的函数.               定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数. 初始化一个Timer对象: Timer timer ...

最新文章

  1. oracle cusor游标,ORACLE CURSOR 游标详解
  2. latex 下划线_Vim Latex 的使用和配置技巧 (三): 用 snippet 编辑 latex
  3. Python简单主机批量管理工具
  4. 01_SMC_Calling_Convention(SMCCC)
  5. PL/SQL Developer下设置“长SQL自己主动换行”
  6. Bootstrap 4:如何使顶部固定的Navbar保持在容器中而不拉伸?
  7. django web 自定义通用权限控制
  8. 【kafka】google提供的一些好用的并发工具类
  9. 计算机it岗考试试题,计算机IT职称考试试题及其答案.doc
  10. 清华大学python视频_涨见识了,清华大学全套Python579集视频教程泄露,拿走学去吧...
  11. 树莓派linux虚拟键盘,树莓派raspbian安装matchbox-keyboard虚拟键盘
  12. 会员无损音乐各种格式转换成mp3等格式
  13. H5打开APP技术总结
  14. Ubuntu16.04解决arpspoof时出现arpspoof: libnet_check_iface() ioctl: No such device问题
  15. 股市前复权、后复权与不复权
  16. python linux 执行scp,python 使用标准库连接linux实现scp和执行命令
  17. 在win7下面安装ubuntu 16.04.4双系统
  18. IBTrACS Technical Documentation
  19. 【Spire.Doc】合并 Word 文档,将多个文档合并为一个
  20. visionpro求旋转中心,拟合圆心操作

热门文章

  1. Synchronized
  2. OFDM数字通信MATLAB仿真实现
  3. 爱奇艺评论爬虫、词频统计、词云、PaddleHub内容审核
  4. APIO2010特别行动队
  5. springboot 调用方法事物_SpringBoot 内部方法调用,事务不起作用的原因及解决办法...
  6. python 股票分析库_GitHub - MrFiona/stock: stock,股票系统。使用python进行开发。
  7. Oculus VR设计指南
  8. CSS3新增选择器及用法详细介绍
  9. TypeError: connection.connect is not a function
  10. Omi教程-组件通讯攻略大全