ElasticSearch学习笔记(二)—ElasticSearch核心概念和倒排索引

一、引言

无论程序怎么写, 意图是一样的: 组织数据为我们的目标所服务。 但数据并不只是由随机比特和字节组成, 我们在数据节点间建立关联来表示现实世界中的实体或者“某些东西”。 属于同一个人的名字和Email地址会有更多的意义。

当我们在存储数据的时候,往往是以行和列的形式将数据存入关系型数据库,这样存让数据的灵活性变差。举个例子,对于人这个对象而已,可以有很多标签,姓名,电话,家庭住址,爱好等等,可是,每个人这些标签数据不一定存在,例如姓名可能存在,也可能存在很多外号,昵称,但是,爱好,电话这些标签可能是空值,如果存储在关系型数据库中,我们需要为每个标签都建立一个列,当标签数量庞大时,这样的表设计是无法想象的。

对象(object)是一种语言相关, 记录在内存中的的数据结构。 为了在网络间发送, 或者存储它, 我们需要一些标准的格式来表示它。 JSON (JavaScript Object Notation)是一种可读的以文本来表示对象的方式。 它已经成为NoSQL世界中数据交换的一种事实标准。 当对象被序列化为JSON, 它就成为JSON文档(JSON document)了,储存文档可以极大程度保存对象灵活性。

二、倒排索引

维基百科给出的定义:
倒排索引(英语:Inverted index),也常被称为反向索引置入档案反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。

有两种不同的反向索引形式:

  • 一条记录的水平反向索引(或者反向档案索引)包含每个引用单词的文档的列表。
  • 一个单词的水平反向索引(或者完全反向索引)又包含每个单词在一个文档中的位置

三、倒排索引相关概念

  • 文档(Document):一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象,相比网页来说,涵盖更多种形式,比如Word,PDF,html,XML等不同格式的文件都可以称之为文档。再比如一封邮件,一条短信,一条微博也可以称之为文档。在本书后续内容,很多情况下会使用文档来表征文本信息。

  • 文档集合(Document Collection):由若干文档构成的集合称之为文档集合。比如海量的互联网网页或者说大量的电子邮件都是文档集合的具体例子。

  • 文档编号(Document ID):在搜索引擎内部,会将文档集合内每个文档赋予一个唯一的内部编号,以此编号来作为这个文档的唯一标识,这样方便内部处理,每个文档的内部编号即称之为“文档编号”,后文有时会用DocID来便捷地代表文档编号。

  • 单词编号(Word ID):与文档编号类似,搜索引擎内部以唯一的编号来表征某个单词,单词编号可以作为某个单词的唯一表征。

  • 单词词典(Lexicon):搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。

  • 倒排列表(PostingList):倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。

  • 倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即被称之为倒排文件,倒排文件是存储倒排索引的物理文件。

四、倒排索引案例

文档集合包含五个文档,在图中最左端一栏是每个文档对应的文档编号,右端是文档内容

首先要用分词系统将文档自动切分成单词序列

单词ID一栏记录了每个单词的单词编号,第二栏是对应的单词,第三栏即每个单词对应的倒排列表。比如单词“谷歌”,其单词编号为1,倒排列表为{1,2,3,4,5},说明文档集合中每个文档都包含了这个单词

这是一个相对复杂些的倒排索引

与前面的基本索引系统对比比,在单词对应的倒排列表中不仅记录了文档编号,还记载了单词频率信息(TF),即这个单词在某个文档中的出现次数,之所以要记录这个信息,是因为词频信息在搜索结果排序时,计算查询和文档相似度是很重要的一个计算因子,所以将其记录在倒排列表中,以方便后续排序时进行分值计算

单词“创始人”的单词编号为7,对应的倒排列表内容为:(3:1),其中的3代表文档编号为3的文档包含这个单词,数字1代表词频信息,即这个单词在3号文档中只出现过1次,其它单词对应的倒排列表所代表含义与此相同

实用的倒排索引还可以记载更多的信息,除上图所示索引系统除了记录文档编号和单词频率信息外,额外记载了两类信息,即每个单词对应的“文档频率信息”以及在倒排列表中记录单词在某个文档出现的位置信息

以单词“拉斯”为例,其单词编号为8,文档频率为2,代表整个文档集合中有两个文档包含这个单词,对应的倒排列表为:{(3;1;<4>),(5;1;<4>)},其含义为在文档3和文档5出现过这个单词,单词频率都为1,单词“拉斯”在两个文档中的出现位置都是4,即文档中第四个单词是“拉斯”。

五、ElasticSerach核心概念

  • Near Realtime(NRT):近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级

  • Cluster:集群,包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是elasticsearch)来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常

  • Node:一个节点(node)就是一个Elasticsearch实例,而一个集群(cluster)由一个或多个节点组成, 它们具有相同的 cluster.name ,它们协同工作, 分享数据和负载。 当加入新的节点或者删除一个节点时, 集群就会感知到并平衡数据

  • Index:索引,一个存储关联数据的地方 索引只是一个用来指向一个或多个分片(shards)的“逻辑命名空间(logical namespace)”

  • Document&field:文档,es中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。一个document里面有多个field,每个field就是一个数据字段。

  • Type:类型,每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type

  • shard:是一个最小级别“工作单元(worker unit)”,它只是保存了索引中所有数据的一部分 ,分片就是一个Lucene实例, 并且它本身就是一个完整的
    搜索引擎

  • replica:任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能

    类比一下数据库:
ElasticSerach 数据库
index
type
docment
field 字段
mapping schema(表结构定义)

你可能感兴趣的:(ElasticSearch)