1.明白为何须要搜索引擎。
2.明白搜索引擎技术是什么、用来解决什么问题(场景)的。明白何时该用它。
3.明白搜索引擎是怎么解决问题的,熟悉搜索引擎的核心概念、工做流程、原理。
4.了解市面上经常使用的搜索引擎框架html
问题1:咱们的应用中通常用什么来存储数据?java
问题2:咱们常常浏览新闻、博客、商品,存储这些数据的表都应有哪些字段?程序员
它们至少有下面这些字段web
问题3:在数据库中如何作查询?以新闻表为例数据库
按类别查
按时间查
按标题模糊查询,查询标题与钓鱼岛有关的新闻
按关键字查询 ,如查询与苍老师有关的新闻api
问题4:当数据量变大时,这四个查询都变慢了,该如何优化?restful
经常使用的数据库优化方法:网络
1.建索引 2.分区表架构
问题5:建索引对 “查询标题与钓鱼岛有关的新闻” 和 “查询与苍老师有关的新闻” 有效果吗?框架
问题6:索引的原理是怎样的?
问题7:索引的排序,是怎么排的?
1.数值列 2.时间列 3.文本列
问题8:在新闻标题列上建索引,当咱们查询 标题 = ‘钓鱼岛’,数据库会怎么去查? 而当咱们查询 标题 LIKE ‘%钓鱼岛%’ ,数据库该如何去查?
问题9:在数据库中如何判断一个列是否能够建索引?
基本原则:
表常常被访问,且数据量很大,而每次查询的数据只占很小很小一部分
列的数据值分布范围普遍
列中包含大量空值
列被常常用在查询条件中(不能是包含在表达式中)
文本列需特殊考虑:常常是用做模糊查询,则不适合建索引。精确查询则可。
问题10:若是要对查询出来的结果进行相关度排名,数据库可否作到?
如:要查询 苍老师、tony、火锅有关的新闻:含有三个关键字(相关度最高)的新闻排前面含两个关键字(相关度次之),排次之含一个关键字 的,排次次之。若是要对搜索的新闻字段设置不一样的权重,好比新闻标题中包含这三个关键字的新闻的相关性就远高于新闻内容中包含这三个字。数据库可否作到?
理论学习
结构化数据: 用表、字段表示的数据
半结构化数据: xml html
非结构化数据: 文本、文档、图片、音频、视频等
结论:数据库适合结构化数据的精确查询,而不适合半结构化、非结构化数据的模糊查询及灵活搜索(特别是数据量大时),没法提供想要的实时性。
问题11:建索引对表的增、删、改操做有效率影响没?
因此为何须要搜索引擎?
结论:数据库适合结构化数据的精确查询,而不适合半结构化、非结构化数据的模糊查询及灵活搜索(特别是数据量大时),没法提供想要的实时性。
分析:咱们查询时,输入的是苍老师,想要获得标题或内容中包含“苍老师”的新闻列表。
若是标题、内容列上都有一个这样的索引,里面能快速找到与苍老师关键字对应的文章id,再根据文章id就能够快速找到文章了。
问题1:你以为这个索引的结构是怎样的?
问题2:为何称为倒排索引?
英文原名Inverted index,失败地被翻译成了倒排索引。 而应该翻译为:反向索引
问题3:下面这两个索引能够合并在一块儿吗?
问题4:反向索引的记录数会不会很大?
若是是英文的,最大是多少? 若是是中文的,最大多是多少?
结论:量不会很大,30万之内;经过这个索引找文章会很快。
问题5:如何创建这样一个索引?
数据示例
新闻id:1
新闻标题:Tony 与苍老师一块儿吃火锅
新闻内容:2018年4月1日,Tony 在四川成都出席某活动时,碰巧主办方也邀请了苍老师来提升人气,在主办方的邀请下和苍老师一块儿吃了个火锅,很爽!
怎样为上面的新闻文章创建反向索引?
一句话怎么分红多个词?人能分,计算机能不能分?
若是是英文文章,好很差分? It’s one thing to find the 10 best documents to match your query
英文好分(有空格),中文则很差分。 但必定得要分,不然没法创建反向索引。
就必须写一套专门的程序来作这个事情:分词器
问题6:分词器与天然语言的关系是怎样?
每门语言有对应的分词器
问题7:若是要开发一个中文分词器,你以为该怎么实现对一句话进行分词?
语句示例:张三说的确实在理。
分析
机器不会分,而咱们人会分。
问1:咱们人是怎么分的?
从头开始一个一个字读,经过先后字的组合,分出:张3、说的、确实、在理
问2:咱们是怎么肯定张3、说的、确实是词?
由于咱们的大脑里有个词的字典,经过与字典匹配,而肯定。
问3:为何咱们不会分出:张3、说的、的确、确实、实在、在理?
由于咱们的大脑能够进行歧义分析。
中文分词器原理:有个词的字典,对语句先后字进行组合,与字典匹配,歧义分析
问题8: java开源中文分词器有哪些?
百度:中文分词器
有不少,如何选择?
准确率 分词效率 中英文混合分词支持
经常使用中文分词器
IKAnalyzer mmseg4j
专业的商用分词器,在词典匹配的基础上加入统计以及机器学习、人工标注。 能很好处理歧义和未登陆词问题,分词速度慢些。 百度、谷歌
问题9: 分词器在分词时能不能统计出词的出现次数、位置?
这两个数值有什么用?
问题10: 你、我、他、的、地、了、标点符号…..这些须要为其建立索引吗?
这些词称为:停用词。分词器支持指定/添加停用词
问题11: 当出现了新词了,该怎么办?
分词器应支持为其词典添加新词。
根据分词结果,咱们建立反向索引,以下所示:
结论:使用分词器对数据进行分词,建立反向索引。
如想搜索与 “tony OR 苍老师” 相关的新闻 步骤是怎样的?
步骤1: 对搜索输入进行分词
tony 、苍老师
步骤2: 在反向索引中找出包含tony、苍老师的文章列表
步骤3: 合并两个列表,排序输出
{1,12,8,5}
问题1:合并后列表该如何排序?
咱们但愿最相关的排在最前面
问题2: 相关性如何度量?
问1:咱们是如何肯定相关的?
包含要找的词
问2:如何肯定更相关?
人能够经过读内容断定相关性,机器不懂人话。
得创建一套能评估相关性的模型。
咱们前面在分词器中统计出的词的出现次数,能够用来创建这个模型吗?评判的规则怎么定?
利用出现次数来创建模型
规则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:修改时,须要怎么更新?
思考1:实时更新在什么状况下可作,什么状况下不可作?什么状况下必须得作?
思考2:搜索引擎巨头百度、谷歌,它们的网页搜索的反向索引是更新仍是重建?
反向索引会有多大?
如 类别 IN () 数值 > = < 时间
一、搜索引擎是什么?
一套可对大量结构化、半结构化数据、非结构化文本类数据进行实时搜索的专门软件
最先应用于信息检索领域,经谷歌、百度等公司推出网页搜索而为大众广知。后又被各大电商网站采用来作网站的商品搜索。现普遍应用于各行业、互联网应用。是大型系统、网站架构师必备技能。
二、搜索引擎是用来解决什么问题的?
专门解决大量结构化、半结构化数据、非结构化文本类数据的实时检索问题。 这种实时搜索数据库作不了。
三、搜索引擎适合什么场景使用?
大量结构化、半结构化、非结构化文本类数据的实时搜索
信息检索(如电子图书馆、电子档案馆)
网页搜索
内容提供网站的内容搜索(如 新闻、论坛、博客网站)
电子商务网站的商品搜索
若是你负责的系统数据量大,经过数据库检索慢,能够考虑用搜索引擎来专门负责检索。
四、搜索引擎由哪些核心部件构成?
数据源
分词器
反向索引(倒排索引)
相关性计算模型
五、搜索引擎的工做原理是怎样的?
一、从数据源加载数据,分词、创建反向索引
二、搜索时,对搜索输入进行分词,查找反向索引
三、计算相关性,排序,输出
六、要实现一个搜索引擎,须要实现哪些?
一、分词器
二、反向索引,索引存储
三、相关性计算模型
七、要去使用一个搜索引擎,须要搞清楚它的哪些方面?
一、分词器
二、反向索引创建、存储、更新
三、相关性计算模型
八、java领域应用普遍的开源搜索引擎组件、系统
Lucene:Apache顶级开源项目,Lucene-core是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的框架,提供了完整的查询引擎和索引引擎,部分文本分词引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础创建起完整的全文检索引擎。
Nutch:Apache顶级开源项目,包含网络爬虫和搜索引擎(基于lucene)的系统(同百度、google)。Hadoop因它而生。
Solr:Lucene下的子项目,基于Lucene构建的独立的企业级开源搜索平台,一个服务。它提供了基于xml/JSON/http的api供外界访问,还有web管理界面。
Elasticsearch:基于Lucene的企业级分布式搜索平台,它对外提供restful-web接口,让程序员能够轻松、方便使用搜索平台,而不须要了解Lucene。
问:如何选择搜索引擎组件或系统?
当作熟度,使用企业量。