基本概念
ElasticSearch中的索引
和MySql中的索引是截然不同的
.它是用于存放数据的地方.也可以先理解成mysql中的database
.
单词-文档矩阵
单词-文档矩阵是表达两者之间所具有的一种包含关系的概念模型.
文档1 | 文档2 | 文档3 | 文档4 | |
---|---|---|---|---|
词汇1 | ✓ | ✓ | ||
词汇2 | ✓ | ✓ | ||
词汇3 | ✓ | ✓ | ||
词汇4 | ✓ | ✓ |
从纵向即文档这个维度来看,每列代表文档包含了哪些单词,比如文档1包含了词汇1和词汇4,而不包含其它单词。从横向即单词这个维度来看,每行代表了哪些文档包含了某个单词。比如对于词汇1来说,文档1和文档4中出现过单词1,而其它文档不包含词汇1。矩阵中其它的行列也可作此种解读。搜索引擎的索引
其实就是实现"单词-文档矩阵"
的具体数据结构。
索引
用于定义文档类型的存储.在同一个索引中,同一个字段只能定义一个数据类型.
文档
存储数据的载体,包含一个或多个存有数据的字段.
文档类型
用于描述文档中的各个字段的定义.不同的文档类型,能够存储不同的字段.服务于不同的查询请求.
文档集合
由若干文档构成的集合称之为文档集合.
文档编号
在搜索引擎内部,会将文档集合内每个文档赋予一个唯一的内部编号.以此编号来作为这个文档的唯一标识,方便内部处理.
单词编号
索引擎内部以唯一的编号来表征某个单词,单词编号可以作为某个单词的唯一表征.
单词词典
搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合.单词词典内每条索引项记载单词本身的一些信息以及指向"倒排列表"的指针。
倒排索引
是实现"单词-文档矩阵"的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表.主要由"单词词典"和"倒排文件"组成.
倒排列表
倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项.根据倒排列表,即可获知哪些文档包含某个单词.
倒排文件
所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即被称之为倒排文件,倒排文件是存储倒排索引的物理文件.
字段
文档的一个Key/Value对.
词
表示文本中的一个单词.
标记
表示在字段中出现的词,由该词的文本、偏移量(开始和结束)以及类型组成.
搜索引擎原理
当在搜索引擎中搜索"羡仙"
时,如果只存在正向索引
,那么就会讲所有的文档内容都查询一遍,找出包含"羡仙"
的文档,再根据打分模型进行打分,排出名次后再呈现给用户.搜索引擎中的文档是个天文数字,这样的索引结构根本无法满足实时返回排名的需求.所以就会用倒排索引
.把关键字映射到文件ID,每个关系词都对应着一些列的文档ID.通过关键字词去查找文档
.看不懂没有关系,往下会有实例进行讲解
倒排索引原理
春晓
春眠不觉晓,处处闻啼鸟。
夜来风雨声,花落知多少。
在上学期间背诗的顺序是诗名,作者最后再是诗文.所以普通索引就是key='诗名'
,value='诗文'
.如果通过'春晓'
考你,那很快的就能背出诗文.但是要是问包含'风'的诗句
.由于没有索引.你就会遍历脑海中所有的诗词.就很难快速的给出答案.
如果用倒排索引
.就是以诗句中的某个字词作为key.诗词的内容作为value.索引key='风'
,value='诗文'
.这样就能很快的找出包含'风'字的诗句.这其中的一句就可以建立10个索引.例如key='夜'
,key='风'
,key='雨'
等.本来正向只用了一个索引.但是反向的却用了很多的索引.这样数据量一大就会出现大量的索引.既然正向能通过诗名查找到诗文.那我们可以这样定义索引key='夜'
,value='春晓'
.这样数据量就会减少.诗名可以理解成数据正向索引.
诗名 | 包含关键字 | |
---|---|---|
春晓 | 鸟 | |
春望 | 鸟 | |
春晓 | 花 | |
清明 | 花 |
所以我们可以这样建立索引
Key | Value |
---|---|
鸟 | 春晓,春望 |
花 | 春晓,清明 |
实例
文档编号 | 文档内容 |
---|---|
1 | 天龙八部十二周年-天龙官网 |
2 | 天龙八部官方论坛 |
3 | 天龙八部onlie官方网站 |
4 | 天龙八部VIP专区-天龙官网 |
5 | 天龙八部游戏官网下载-天龙官网 |
中文和英文等语言不同,单词之间没有明确分隔符号,所以首先要用分词系统将文档自动切分成单词序列.这样每个文档就转换为由单词序列构成的数据流,为了系统后续处理方便,需要对每个不同的单词赋予唯一的单词编号,同时记录下哪些文档包含这个单词,在如此处理结束后,我们可以得到最简单的倒排索引
.
单词ID | 单词 | 倒排列表 |
---|---|---|
1 | 天龙 | 1,2,3,4,5 |
2 | 八部 | 1,2,3,4,5 |
3 | 官网 | 1,5 |
4 | 官方 | 2,3 |
5 | 论坛 | 2 |
6 | onlie | 3 |
7 | 网站 | 3 |
8 | VIP | 4 |
9 | 游戏 | 5 |
10 | 专区 | 4 |
11 | 下载 | 5 |
我们建立的简单倒排索引只包含了文档ID.还可以包含文档频率,出现次数和出现位置,如下
单词ID | 单词 | 出现次数 | 倒排列表 |
---|---|---|---|
1 | 天龙 | 8 | (1;2;<1,5>),(2;1;<1>),(3;1;<1>),(4;2;<1,5>),(5;2;<1,6>) |
2 | 八部 | 5 | (1;1;<2>),(2;1;<2>),(3;1;<2>),(4;1;<2>),(5;1;<2>) |
3 | 官网 | 4 | (1;1;<6>),(4;1;<6>),(5;2;<4,7>) |
4 | 官方 | 2 | (2;1;<3>),(3;1;<4>) |
5 | 论坛 | 1 | (2;1;<4>) |
6 | onlie | 1 | (3;1;<3>) |
7 | 网站 | 1 | (3;1;<5>) |
8 | VIP | 1 | (4;1;<3>) |
9 | 游戏 | 1 | (5;1;<3>) |
10 | 专区 | 1 | (4;1;<4>) |
11 | 下载 | 1 | (5;1;<5>) |
有了这个索引系统,搜索引擎可以很方便地响应用户的查询,比如用户输入查询词"天龙",搜索系统查找倒排索引,从中可以读出包含这个单词的文档,这些文档就是提供给用户的搜索结果,而利用单词频率信息、文档频率信息即可以对这些候选搜索结果进行排序,计算文档和查询的相似性,按照相似性得分由高到低排序输出,此即为搜索系统的部分内部流程.
至于读者大哥们很感谢你们看完.看懂看不懂我写的不重要,会用就写了.日后有缘再更新索引的使用,现在已经快4点了啊!
祝大家学习愉快~