跳到主要内容

01、ElasticSearch 实战:Elasticsearch的介绍

elasticsearch基本概念

Lucene

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎

介绍Elasticsearch就需要先介绍Lucene。上面内容是百度上的词条。从上面我们可以知道Lucene是个全文检索、引擎工具包、不完整的全文检索引擎。

而Elasticsearch则是基于Lucene的一个支持开源、分布式使用RESTful格式的全文搜索引擎。同时elasticsearch还承担了数据库的功能,支持对每个字段进行索引。而elasticsearch最大的优势在于其能够横向扩展大量的服务器存储,能处理PB级别的数据。并且提供了短时间对大量数据的搜索和分析功能。其是现在使用最多的开源引擎之一,主要使用者Wikipedia、Stack Overflow、GitHub 等。同时其开发公司Elastic公司和阿里巴巴在elasticsearch上有深度合作。

Elasticsearch可以做什么

当你系统收集日志或者交易数据的时候,需要分析和挖掘这些数据,寻找产品态势、描绘顾客画像的时候。这种定位异常情况的时候,你可以使用Logstash或者其他工具来进行收集数据,当这引起数据存储到ElasticsSearch中。你可以搜索和汇总这些数据。然后从中挖掘出有价值的内容。

数据的区别

上面我们知道Elasticsearch是一个全文搜索引擎,在介绍全文搜索之前,我们需要知道数据被区分的种类,因为全文搜索主要是针对非结构化数据的。

数据分类

结构化数据

具有固定格式或有限长度的数据此数据,我们一般使用关系型数据库的table方式存储和搜索,结构化的数据的存储和排列是很有规律的,这对查询和修改等操作很有帮助。我们可以建立索引。通过b-tree等数据数据结构快速搜索数据。

非结构化数据

主要指的是具有不定长或者无固定格式数据的数据。各种文档、图片、视频/音频等都属于非结构化数据。对于这类数据,我们一般直接整体进行存储,而且一般存储为二进制的数据格式。针对此数据的检索,我们一般使用顺序扫描法或全文扫描的方式进行检索。

顺序扫描法

假如我们需要确定某个关键词出现的地方的时候,需要对文档中关键词进行标记,然后将标记后的结构展示出来。就比如,我们需要查找一本书中每个关键词的位置,我需要从头到尾将文字阅读一遍,然后才能标记处所有的位置。很明显这是一种效率较低的方式,如果数据很多,我们需要大量资源才能完成数据的检索。

全文检索

将非结构化的数据中一部分信息提取出来,重新组织,然后使其有一定的结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。

Elasticsearch和传统数据库的比较

  • 数据类型 :全⽂文索引搜索很好的支持非结构化数据的搜索,可以更好地快速搜索大量存在的任何单词非结构化文本。对于这些非结构化的数据文本,关系型数据库搜索不是能很好的支持。
  • 搜索性能 :当我们需要在大段的文字中寻找,文字中的关键词的时候。传统数据库中我们需要使用like ‘%james%’ 此时会导致索引失效,千万级以上数据进行此操作,会有非常资源消耗,并且系统响应效率低下。
  • 索引维护 :传统数据库,我们很少让某个字段维护超长的内容,更不会为其创建索引,因为进行全⽂文搜索的时候需要扫描整个表,如果数据量大的话即使对SQL的语法进行优化,也是效果甚微。即使建立了了索引,但是维护起来也很麻烦,对于 insert 和 update 操作索引的构建使其效率变得低下。

使用Elasticsearch的场景

  • 搜索的数据对象是⼤量的⾮结构化的⽂文本数据。
  • 文本数据量量达到百万级别或千万级别,甚⾄至更更多。
  • ⽀持⼤量基于交互式⽂本的查询。
  • 需求非常灵活的全⽂搜索查询。
  • 对安全事务,⾮文本数据操作的需求相对较少的情况。

elasticsearch的基础概念

基础数据概念

elasticsearch使用index、type、mapping、document、field来定义数据存储的结构。

index

索引:在elasticsearch中index可以理解为关系数据库中的一个数据库。在elasticsearch中符合一套逻辑业务的数据会放在一起,然后查询的时候也是基于某个index下的数据进行操作。

type

类型:type是一个在7.x之后已经被移除的概念,简单的理解可以认为是关系型数据库中一张表的概念,不过现在type已经不使用了。也可以认为index是一张表数据。

mapping

映射:elasticsearch中的mapping定义了每个字段的类型等信息,相当于关系型数据库中的表结构

document

文档:elasticsearch中文档是一条数据的称呼,可以认为是关系型数据库中的一行数据

field

字段:相当于关系型数据库表的字段

集群概念

cluster

集群:elastic search支持分布式集群的,可以支持一个或多个节点组成

node

节点:集群下节点

主分片

一个index数据在物理上被分布在多个主分片中,每个主分片只存放部分数据。

副本分片

每个主分片可以有多个副本,叫副本分片,是主分片的复制。

路由

当存储一个文档的时候,它会存储在唯一的主分片中,具体哪个分片是通过散列值进行选择

倒排索引

Elasticsearch提供强大的搜索和数据分析关键是其索引能力。而这里就不得不说Elasticsearch是做到快速索引的关键:倒排索引

倒排列表用来记录一个文档中包含了哪些关键词,在一个文档中会有很多相同的关键词,每个文档会记录文档编号,单词在这个文档中出现的次数及单词在文档中哪些位置出现过等信息,这样与一个文档相关的信息被称做倒排索引项,包含这个单词的一系列倒排索引项形成了列表结构,这就是某个单词对应的倒排列表。可以理解为我们抽出了文档中的关键词然后来反向定位文档位置。

当然对于初学者再简练的文字也不如画图来的清晰。碰巧之前也看到过关于倒排索引的一篇漫画,这个漫画对于大多数开发来说是一个很好的入门。

从诗词大会飞花令到elasticsearch原理解析