【知识点】数据库索引的原理是怎样的?
优采云 发布时间: 2021-06-08 20:22【知识点】数据库索引的原理是怎样的?
问题一:数据库索引的原理是什么?
索引原则:为列值创建排序存储,数据结构={列值,行地址}。在有序的数据列表中,可以通过二分查找快速找到待查找行的地址,然后根据地址直接获取行数据。
问题2:索引是如何排序的?
值列
时间列
文本栏
问题 3:在新闻标题栏上建立索引。当我们查询title = ‘Diaoyu Islands’时,数据库将如何查找?而当我们查询标题LIKE ‘%Diaoyu Islands%’时,数据库应该怎么查?
像索引失效,全表扫描,数据量大的时候简直就是噩梦。
问题4:如何判断一列是否可以在数据库中建立索引?
基本原则:
该表访问频繁,数据量很大,每次查询的数据只占很小一部分
列的数据值分布广泛
该列收录大量空值
列常用于查询条件(不能收录在表达式中)
注意:文本列需要特别考虑:它们通常用于模糊查询,不适合索引。准确查询没问题。
问题5:如果要对查询结果的相关性进行排序,数据库能做到吗?
例如,如果您想查询有关苍夫人、托尼、火锅的新闻:
收录三个关键词(最相关)的新闻排名第一
收录两个关键词(相关性第二),第二个是排名
有关键字的排在第二位。
如果要为搜索到的新闻字段设置不同的权重,例如,新闻标题中收录这三个关键字的新闻的相关性远高于收录这三个词的新闻内容的相关性。数据库能做到吗?
答案:如果不能,此时您需要一个搜索引擎。
问题 6:常见的数据结构有哪些?
结构化数据:以表格和字段表示的数据
半结构化数据:xml、html
非结构化数据:文本、文档、图片、音频、视频等
在讨论了前面的问题之后,我得出了为什么需要搜索引擎的结论:
数据库适用于结构化数据的精确查询,但不适合半结构化和非结构化数据的模糊查询和灵活搜索(尤其是数据量较大时),不能提供理想的实时性能。
二、如何创建反向索引
问题一:如何快速找到与苍夫人相关的新闻?
分析:我们搜索的时候输入的是仓先生,我们想得到一个标题或内容中收录“仓先生”的新闻列表。
如果title和content列有这样的索引,可以快速找到仓先生的关键字对应的文章id,然后根据文章id快速找到文章。
标题列索引:
内容列索引:
词到文章id的索引,这是:倒排索引
问题 2:问题 1 的标题列索引和内容列索引可以合并在一起。有什么好处?
合并的好处是:可以减少访问数据库的次数
问题3:反向索引的记录数会不会很大?如果是英文,最大是多少?如果是中文,最大可能是多少?
英文单词的大概数量是 100,000。汉字总数已超过80,000个,而常用字仅3,500个。
《现代汉语标准词典》的字词比《现代汉语词典》收录多。前者13000多字72000多字,后者11000多字69000多字
结论:金额不会很大,30万以内;通过这个索引找到文章会非常快
问题 4:如何构建问题 2 中的倒排索引?
数据示例:
新闻 ID:1
新闻标题:托尼和仓太太一起吃火锅
新闻内容:2018年4月1日,Tony在四川成都参加一个活动的时候,恰巧主办方还邀请了苍老师来增加自己的人气。应主办方的邀请,他和苍夫人一起吃了火锅。酷!
如果是英文文章,分一下怎么样?
找到与查询匹配的 10 个最佳文档是一回事
英文好(有空格),但中文不好。但必须打分,否则无法建立反向指标。
你必须编写一个特殊的程序来做到这一点:分词器
中文分词器原理:有词词典,前后词结合,与词典匹配,歧义分析
问题5:java开源中文分词器很多,如何选择?
准确率、分词效率、中英文混合分词支持
常用的中文分词器:
IKAnalyzer、mmseg4j
问题 6:你、我、他、“、”、“a”、标点符号……这些需要索引吗?
这些词被称为:停用词。分词器支持指定/添加停用词,无需为其创建索引
问题7:出现新词怎么办?
嫂子,老司机,软妹儿,直男,玩腿,苍老师
分词器应支持在其字典中添加新词。
总结:
根据分词结果,我们建立倒排索引如下:
三、我有反向索引,怎么搜索?
搜索“tony OR苍老师”相关新闻的步骤是什么?
第 1 步:分割搜索输入
托尼,苍老师
第2步:在反向索引中找到收录Tony和Cang夫人的文章list
第三步:合并两个列表,对输出进行排序
{1,12,8,5}
四、如何建立相关性评价模型?
使用出现次数建立模型
规则一:统计出现次数,按次数从高到低排序
{{1,5},{5,3},{12,1},{8,1}}:文章1出现5次,文章5出现3次,文章12出现1 次,文章8 出现 1 次
问题1:标题出现仓先生,新闻内容出现仓太太。哪个和仓先生更相关?怎么做
规则二:加权重,标题权重10,内容权重1,计算权重得分,按高低排序
{{1,23},{12,10},{5,3},{8,1}}
总结:关联模型非常简单,使用出现次数来构建模型。有时排序不是很准确。
复杂的相关性计算模型包括:
tf-idf 词频-逆文档率模型
矢量空间模型
贝叶斯概率模型,如:BM25
搜索引擎将提供一种或多种实现方式以供选择以及扩展。
电子商务网站搜索相关性的计算会越来越复杂。
五、反向索引更新:数据更新的时候索引一定要更新吗?更新好了吗?
更新情况分析:
Q1:添加新商品时,我需要如何更新?
Q2:删除时,我需要如何更新?
Q3:进行更改时,我需要如何更新?
六、反向索引应该存储在内存中还是磁盘上?
大的放磁盘,小的放内存,需要持久化
七、搜索引擎需要支持精准搜索吗?需要像数据库一样支持多条件AND OR组合搜索?
如类别IN()值>=
必须的,否则没人会用搜索引擎
八、Summary
1、什么是搜索引擎?
一套可以实时搜索大量结构化、半结构化数据和非结构化文本数据的专用软件
最早用于信息检索领域,通过谷歌、百度等公司推出网络搜索而为大众所熟知。后来被各大电商网站采用做网站产品搜索。现在广泛应用于各个行业和互联网应用。是大型系统和网站架构师必备的技能。
2、搜索引擎解决什么样的问题?
专门解决大量结构化、半结构化数据、非结构化文本数据的实时检索问题。这种实时搜索数据库是做不到的。
3、搜索引擎适合什么样的场景?
核心:实时搜索大量结构化、半结构化、非结构化文本数据
信息检索(例如电子图书馆、电子档案)
网页搜索
通过提供网站(如新闻、论坛、博客网站)进行内容搜索
E-commerce网站的产品搜索
如果你负责的系统数据量大,通过数据库检索速度慢,可以考虑使用搜索引擎专门检索。
4、搜索引擎的核心组件是什么?
数据源、tokenizer、倒排索引(inverted index)、相关计算模型
5、搜索引擎是如何工作的?
1、从数据源加载数据,切词,建立反向索引
2、搜索时,对搜索输入进行分段,找到反向索引
3、计算相关、排序、输出
6、实现一个搜索引擎,需要实现什么?
1、分词器
2、反向索引,索引存储
3、相关计算模型
7、使用搜索引擎,需要明确哪些方面?
1、分词器
2、反向索引创建、存储、更新
3、相关计算模型
8、java 是广泛使用的开源搜索引擎组件和系统
Lucene:Apache的顶级开源项目,Lucene-core是一个开源的全文搜索引擎工具包,但它并不是一个完整的全文搜索引擎,而是一个全文搜索引擎框架,提供了一个完整的查询引擎和索引引擎,文本切分引擎的一部分(英语和德语两种西方语言)。 Lucene 的目的是为软件开发者提供一个简单易用的工具包,以便在目标系统中轻松实现全文搜索功能,或者以此为基础构建一个完整的全文搜索引擎。
Nutch:Apache 的顶级开源项目,包括网络爬虫和搜索引擎(基于 lucene)系统(与百度和谷歌相同)。 Hadoop 因它而诞生。
Solr:Lucene 下的一个子项目,一个基于 Lucene 的独立企业级开源搜索平台,一个服务。提供基于xml/JSON/http的api对外访问,以及web管理接口。
Elasticsearch:基于 Lucene 的企业级分布式搜索平台。它提供了一个宁静的网络界面,让程序员无需了解 Lucene 即可轻松方便地使用搜索平台。
问题:如何选择搜索引擎组件或系统?
关注成熟度并使用企业量。
更多精彩内容,请扫描下方二维码进入网站。 . . . .