elasticsearch 大揭秘(ElasticSearch入门到实战系列)

1. ElasticSearch简介1.1 ES简介

Elasticsearch(以下简称 ES) 是使用java开发,基于lucene、分布式、通过RESTFUL方式进行交互的近实时搜索平台框架。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

ES 是 ELK 架构技术栈的组件之一。

ELK(ES Logstash Kibana)是一个免费开源的日志分析架构技术栈总称,但实际上ELK不仅仅适用于日志分析,它还可以支持其它任何数据搜索、分析和收集的场景,日志分析和收集只是更具有代表性。随着elk的发展,又有新成员Beats、elastic cloud的加入,所以就形成了Elastic Stack。所以说,ELK是旧的称呼,Elastic Stack是新的名字。

1.2 ES特点
  • 处理方式灵活:ES 是目前最流行的准实时全文检索引擎,具有高速检索大数据的能力。
  • 接口简单:采用json形式RESTFUL API接受数据并响应,无关语言。
  • 性能高效:ES 基于优秀的全文搜索技术Lucene,采用倒排索引,可以轻易地在百亿级别数据量下,搜索出想要的内容,并且是秒级响应。
  • 功能强大:ES 作为传统数据库的一个补充,提供了数据库所不不能提供的很多功能,如全文检索,同义词处理,相关度排名。
1.3 应用场景

ES 主要用于 搜索 。传统的数据库搜索存在以下弊端

  • 电商、社交网站数据存储往往是GB、PB级。存储上亿条数据时,涉及到的单表数据过大就必须分表,数据库磁盘占用过大就必须分库。
  • 当查询 JavaWeb 时,上亿条数据的帖子需要从标题和内容中逐行扫描,性能相当差。
  • 不能分词,当我搜索 Java Web 时,只能搜到 Java Web 的数据,而搜不到 JavaWeb 的数据。

而相对的,就可以使用 ES 进行解决。ES 具有以下功能

  • 分布式的搜索引擎

搜索:互联网搜索、站内搜索

  • 全文检索,结构化检索,数据分析
  • 对海量数据进行近实时的处理

分布式:ES自动可以将海量数据分散到多台服务器上去存储和检索,经行并行查询。

近实时:es只需秒级即可查询海量数据。

1.4 Lucene&solr&ES

Lucene:最先进、功能最强大的搜索库,直接基于lucene开发,非常复杂,api复杂。

solr:Solr是一个高性能,采用Java开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。

ES:基于lucene,封装了许多lucene底层功能,提供简单易用的restful api接口和许多语言的客户端。据说ES的搜索性能是Solr的50倍。起源:Shay Banon。2004年失业,陪老婆去伦敦学习厨师。失业在家帮老婆写一个菜谱搜索引擎。封装了lucene的开源项目,compass。找到工作后,做分布式高性能项目,再封装compass,写出了 ES,使得lucene支持分布式。现在是 ES 创始人兼Elastic首席执行官。

solr和 ES 性能对比。

当单纯的对已有数据进行搜索,并且数据量不是很大时,Solr更快。

elasticsearch 大揭秘(ElasticSearch入门到实战系列)(1)

当实时建立索引时, Solr会产生io阻塞,查询性能较差, ES 具有明显的优势。

elasticsearch 大揭秘(ElasticSearch入门到实战系列)(2)

随着数据量的增加,Solr的搜索效率会变得更低,而 ES 却没有明显的变化。

elasticsearch 大揭秘(ElasticSearch入门到实战系列)(3)

综上所述,Solr的架构不适合实时搜索的应用。

1.5 倒排索引1.5.1 正排索引

在说倒排索引之前我们先说说什么是正排索引。正排索引也称为"前向索引",它是创建倒排索引的基础。

这种组织方法在建立索引的时候结构比较简单,建立比较方便且易于维护;因为索引是基于文档建立的,若是有新的文档加入,直接为该文档建立一个新的索引块,挂接在原来索引文件的后面。若是有文档删除,则直接找到该文档号文档对应的索引信息,将其直接删除。

他适合根据文档ID来查询对应的内容。但是在查询一个keyword在哪些文档里包含的时候需对所有的文档进行扫描以确保没有遗漏,这样就使得检索时间大大延长,检索效率低下。

文档ID

文档内容

1

elasticsearch是最流行的搜索引擎

2

php是世界上最好的语言

3

搜索引擎是如何诞生的

优点:工作原理非常的简单。

缺点:检索效率太低,只能在一起简单的场景下使用。

1.5.2 倒排索引

根据字面意思可以知道他和正序索引是反的。在搜索引擎中每个文件都对应一个文件ID,文件内容被表示为一系列关键词的集合(文档要除去一些无用的词,比如’的’这些,剩下的词就是关键词,每个关键词都有自己的ID)。例如“文档1”经过分词,提取了3个关键词,每个关键词都会记录它所在在文档中的出现频率及出现位置。

那么上面的文档及内容构建的倒排索引结果会如下图。

单词

文档ID列表

elasticsearch

1

流行

1

搜索引擎

1,3

php

2

世界

2

最好

2

语言

2

如何

3

诞生

3

如何查询

比如我们要查询‘搜索引擎’这个关键词在哪些文档中出现过。首先我们通过倒排索引可以查询到该关键词出现的文档位置是在1和3中;然后再通过正排索引查询到文档1和3的内容并返回结果。

1.5.3 组成

倒排索引主要由单词词典(Term Dictionary)和倒排列表(Posting List)及倒排文件(Inverted File)组成。

他们三者的关系如下图:

elasticsearch 大揭秘(ElasticSearch入门到实战系列)(4)

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

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

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

1.6 ES核心概念

近实时(NRT)

  • 写入数据时,内部在分词、录入索引,一般过1秒左右才会被搜索到
  • ES搜索时,搜索和分析数据基本秒级出结果

集群(Cluster)

包含一个或者多个启动着ES的机器群,同一网络下、集合一样的多个ES实例 自动组成集群,自动分片 等行为

节点(Node)

每个ES实例称为一个节点。节点名称可以手动设置,默认自动分配。

索引(Index)

包含一堆有相似结构的文档数据。相当于数据库(也相当于表)

索引创建规则:

  • 仅限小写字母
  • 不能包含\、/、 *、?、"、<、>、|、#以及空格符等特殊符号
  • 从7.0版本开始不再包含冒号
  • 不能以-、_或 开头
  • 不能超过255个字节(注意它是字节,因此多字节字符将计入255个限制)

文档(Document)

ES中最小的数据单元,对应着数据库中的一条记录。

ES的文档通常用JSON格式展示,多个文档存储于一个索引中

字段(Field)

对应数据库中的列

类型(Type)

每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field。

ES官方将在9.0版本之后彻底删除type

分片(shard)

索引的数据量过大时,可以将索引中的数据分成多个分片,存储在多个服务器上。支持海量数据和高并发,提升性能和吞吐量。

副本(replica)

在分布式环境下,任何一台机器都会随时宕机,如果宕机,就会导致此索引不能搜索。所以,为了保证数据的安全,我们会将每个索引的分片经行备份,存储在另外的机器上。保证少数机器宕机es集群仍可以搜索。

能正常提供查询和插入的分片我们叫做主分片(primary shard),其余的我们就管他们叫做备份的分片(replica shard)。

es6.0默认新建索引时是一主一备,2副本5分片,总计10个集群。因此ES集群 至少需要2台服务器

MySQL

Elasticsearch

数据库Database

索引Index

表Table

索引Index(旧版本中对应type)

数据行row

文档 Document

数据列Column

字段Field

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页