ElasticSearch

361 阅读15分钟

ElasticSearch简介

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

ElasticSearch特点

1、可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公司;也可以运行在单机上,服务小公司。 2、ElasticSearch将全文检索、数据分析及分布式技术,合并在了一起。 3、对用户而言,是开箱即用的,非常简单。 4、数据库的功能面对很多领域是不够用的(事务,还有各种联机事务型的操作);特殊的功能,比如全文索引、同义词处理、相关排名、复杂数据分析,海量数据的近实时处理。ElasticSearch作为传统数据库的一个补充,提供了数据库所不能提供的很多功能。 5、默认的分布式工作模式。每个节点总是假定自己是集群的一部分或将是某个集群的一部分,一旦工作启动节点便会加入某个集群。 6、对等架构可以避免单点故障。节点会自动连接到集群中的其他节点,进行互相的数据交换和监控操作。这其中就包括索引分片的自动复制。

ElasticSearch的核心概念

近实时 两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级。 Cluster(集群) 集群是一个或多个节点(服务器)的集合,它们共同保存你的整个数据,并提供跨所有节点的联合索引和搜索功能。一个集群由一个唯一的名称标识,默认这个唯一标识的名称是"elasticsearch"。这个名称很重要,因为如果节点被设置为按其名称加入集群,那么节点只能是集群的一部分。 Node(节点) 集群中的一个节点,节点也有一个名称(默认是随机分配),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为"elasticsearch"的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群。 Index(索引-数据库) 索引包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个Index就代表了一类类似的或者相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据,所有的商品document。 Type(类型-表) 每个索引都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field。

全文检索

全文检索是指:计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。全文搜索搜索引擎数据库中的数据。

倒排索引

简介

倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引

倒排索引包含两个部分

单词词典:记录所有文档的单词,记录单词到倒排列表的关联关系

单词词典一般比较大,可以通过B+树或哈希拉链法实现,以满足高性能的插入与查询

倒排列表:记录了单词对应的文档结合,由倒排索引项组成

倒排索引项

文档 ID 词频 TF - 该单词在文档中出现的次数,用于相关性评分 位置 Position - 单词在文档中分词的位置,用于语句搜索 偏移 Offset - 记录单词的开始结束的位置,实现高亮显示

例子:

原理

Lucene简介

Lucene是一款高性能的、可扩展的信息检索(IR)工具库,是由Java语言开发的成熟、自由开源的搜索类库,基于Apache协议授权。Lucene只是一个软件类库,如果要发挥Lucene的功能,还需要开发一个调用Lucene类库的应用程序。

Analyzer

文本分析由分词器来执行

分词器是专门处理分词的组件,Analyzer由三部分组成

Character Filters:针对原始文本处理,例如取出html Tokenizer:按照规则切分为单词 Token Filters:将切分的单词进行加工,小写,删除 stopwords,增加同义词

ElasticSearch内置分词器

ElasticSearch分布式特性

ElasticSearch集群可以说是一个分布式的系统,需要满足:高可用性,可扩展性

ElasticSearch的分布式架构的好处

1、存储的水平扩容 2、提高系统的可用性,部分节点停止服务,整个集群的服务不受影响

ElasticSearch的分布式架构

不同的集群通过不同的名字来区分,默认名字"elasticsearch" 通过配置文件修改,或者在命令中 -E cluster.name=geektime进行设定 一个集群可以有一个或者多个节点

什么是Mapping?

1、Mapping类似数据库中的schema的定义,作用如下

定义索引中的字段的名称 定义字段的数据类型,例如字符串、数字、布尔...... 字段,倒排索引的相关配置

2、Mapping会把JSON文档映射成Lucene所需要的扁平格式
3、一个Mapping属于一个索引的Type

每个文档都属于一个Type 一个Type有一个Mapping定义 7.0开始,不需要在Mapping定义中指定type信息

能否修改Mapping的字段类型

什么是聚合?

Elasticsearch提供了 Bucket/Metric/Pipeline/Matrix四种方式的聚合

ElasticSearch搜索相关

基于Term查询

Term的重要性

Term是表达语义的最小单位。搜索和利用统计语言模型进行自然语言处理都需要处理Term

特点

Term查询不会做分词处理,如果想对ID进行全匹配,需要加上keyword

复合查询 - Constant Score 转为 Filter

基于全文的查询

基于全文本的查找

Match Query / Match Phrase Query / Query String Query

特点

1、Match Phrase Query

Match Query查询过程

总结

基于词项(Term)的查找 vs 基于全文的查找

Term查询不会做分词处理,全文本查询会做分词处理

通过字段 Mapping 控制字段的分词 “Text”vs“keyword”

如果想做精确查询可以在Mapping中把字段设置成keyword

通过参数控制查询的Precision & Recall 复合查询 - Constant Score查询

即便是对keyword进行 Term查询,同样会进行算分 可以将查询转为 Filtering, 取消相关性算分的环节,以提升性能

结构化搜索

结构化数据

结构化搜索是指对结构化数据的搜索

日期,布尔类型和数字都是结构化的

文本也可以是结构化的

如彩色笔可以有离散的颜色集合 :红、绿、蓝 一个博客可能被标记了标签,例如,分布式和搜索 电商网站上的商品都有UPCs (通用产品吗码) 或其他唯一标识,它们都需要遵从严格规定的、结构化的格式

相关性和相关性算分

相关性

搜索的相关性算分,描述了一个文档和查询语句匹配的程度。ES会对每个匹配查询条件的结果进行算分 _score

打分的本质是排序,需要把最符合用户需求的文档排在最前面。ES5之前,默认的相关性算分采用 TF-IDF,现在采用BM25

ElasticSearch的工作流程

启动过程

当ElasticSearch节点启动时,它使用广播技术(也可配置为单播)来发现同一个集群中的其他节点并与它们连接。 集群中会有一个节点被选为管理节点(master node)。该节点负责集群的状态管理以及在集群拓扑变化时做出反应,分法索引至集群的相应节点上。

故障检测

集群正常工作时,管理节点会监控所有可用节点,检査它们是否正在工作。如果任何 节点在预定义的超时时间内没有响应,则认为该节点已经断开,然后开始启动错误处理过程。

索引数据

ElasticSearch提供了四种方式来创建索引:

使用索引API,它允许用户发送一个文档至特定的索引。 允许用户通过bulk API来一次性发送多个文档至集群。(使用HTTP协议) 允许用户通过UDP bulk API来一次性发送多个文档至集群。(使用UDP协议) 使用插件发送数据,称为河流,河流运行在ElasticSearch节点上,能从外部系统获取数据。

注意:建索引操作只会发生在主分片上,而不是副本上。当把一个索引请求发送至某节点时,如果该节点没有对应的主分片或者只有副本,那么这个请求会被转发到拥有正确的主分片的节点(如下图所示)。

查询数据

可以使用DSL进行数据查询,一般来说查询分为两个阶段:

分散阶段:将query分发到包含相关文档的多个分片中去执行查询。 合并阶段:从众多分片中收集返回结果,然后对它们进行合并、排序、后续处理,然后返回给客户端。

Apache Lucene默认评分公式解释

  • 文档得分是一个刻画文档与查询匹配程度的参数。
  • 当一个文档经Lucene返回,则意味者该文档与用户提交的查询是匹配的,这种情况下,每个返回的文档都有一个得分。得分越高,文档相关度更高。
  • 同一个文档针对不同查询的得分是不同的,而且比较某文档在不同查询中的得分是没有意义的。
  • Apache Lucene默认评分机制:TF/IDF(词频/逆文档频率)

分析ElasticSearch和MongoDB、mysql各自的区别

简介

ElasticSearch

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

MongoDB

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能,为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

MySQL

MySQL是一个轻量级关系型数据库管理系统, 关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,就增加了速度并提高了灵活性。

应用场景

ElasticSearch

ElasticSearch主要应用在: 全文索引、同义词处理、日志管理、应用性能监控、相关排名、复杂数据分析,海量数据的近实时处理的场景中。

MongoDB

MongoDB很适合那些表结构经常改变,数据的逻辑结构没又没那么复杂不需要多表查询操作,数据量又比较大的应用场景。

MySQL

MySQL可以用作数据仓库,专门存储数据,以及需要对数据进行事务操作的场景

优缺点

ElasticSearch

优点

1、 支持全文索引 2、自动为所有字段建立索引,以实现高性能的复杂聚合查询,因此只要是存入ES的数据,无论再复杂的聚合查询也可以得到不错的性能

缺点

1、字段类型无法修改

ES需要在创建字段前要预先建立Mapping,Mapping中包含每个字段的类型信息,ES需要根据Mapping为字段建立合适的索引。由于这个Mapping的存在,ES中的字段一但建立就不能再修改类型了。 (例如,建的数据表的某个字段忘了加全文搜索,想临时加上,但是表已经建好并且已经有很多数据了,这时候该怎么办呢? 只能把整个数据表删了再重建一遍!)因此,ES在数据结构灵活度上高于MySQL但远不如MongoDB。

2、写入性能较低

自动建立索引使得ES的写入性能也收到了影响,要明显低于MongoDB。对于同样的数据ES占用的存储空间也要明显大于MongoDB。

3、高硬件资源消耗 4、事务关系支持薄弱

MongoDB

优点

1、表结构灵活可变

MongoDB中的每一行数据只是简单的被转化成Json格式后存储,因此MongoDB中没有MySQL中表结构这样的概念

2、字段类型可以随时修改

可以直接简单粗暴的将任意结构的数据塞入同一个表中,不必考虑表结构的限制,更不必像MySQL一样因为要修改数据表结构而大费周折

3、横向扩展性强,可以支撑很大数据量和开发

缺点

  • 事务关系支持薄弱
  • MongoDB不需要定义表结构这个特点给表结构的修改带来了极大的方便,但是也给多表查询、复杂事务等高级操作带来了阻碍。因此,如果数据的逻辑结构非常复杂,经常需要进行复杂的多表查询或者事务操作,那显然还是MySQL这类关系型数据库更合适。

MySQL

优点

  • 它使用的核心线程是完全多线程,支持多处理器。
  • 全面支持SQL的GROUP BY和ORDER BY子句.
  • 支持大型的数据库, 可以方便地支持上千万条记录的数据库。作为一个开放源代码的数据库,可以针对不同的应用进行相应的修改。
  • 支持事务操作

缺点

  • 不支持热备份 
  • 没有一种存储过程(Stored Procedure)语言

不同点

  • MongoDB是一个以JSON为数据模型的文档数据库,ElasticSearch也是一个以JSON为数据模型的搜索型数据库,MySQL是一个关系型数据库。
  • 在CRUD操作中,MongoDB是用MQL来操作数据,ElasticSearch是用DSL来操作数据,MySQL是用SQL来操作数据。
  • 在架构上,MongoDB通过复制集来实现高可用,ElasticSearch是通过cluster(集群)来实现高可用,MySQL是通过集群模式来实现高可用。
  • 横向扩展能力方面,MongoDB通过原生分片完善支持,ElasticSearch也是通过分片(Primary Shard & Replica Shard)来支持,MySQL通过数据分区或者应用侵入式来支持。
  • 索引支持,MongoDB(B-树、全文索引、地理位置索引、多建索引、TTL索引)ElasticSearch(全文索引、倒排索引),MySQL(B树)
  • 数据容量上,MongoDB没有理论上限,MySQL大约是千万,亿级。
  • 在模型关系上,MongoDB是通过内嵌数据、引用字段来表示表与表之间的关系,MySQL是通过关联关系、主外键来表示表与表之间的关系。

分析

  • es全文检索有强大的分析器且可以灵活组合,查询时智能匹配。mongodb的全文检索字段个数有限制。es所有字段自动索引,mongodb的字段需要手动索引。所以es会比mongodb更适合做搜索。
  • 如果你的数据规模较大,对数据的读性能要求很高,数据表的结构需要经常变,有时还需要做一些聚合查询,选MongoDB;
  • 如果你需要构造一个搜索引擎或者你想搞一个看着高大上的数据可视化平台,并且你的数据有一定的分析价值,选ElasticSearch;
  • 如果对数据的事务操作要求很高,选MySQL;