深入学习ElasticSearch之初始
1.ElasticSearch
Doug Cutting
- 搜索工具库(Lucene=> Java 编写的),功能:全文检索。开源 Apache。
- Lucene基础之上(封装),Nutch
- Nutch 在业界会更火一点。使用比较友好。
ElasticSearch 就是基于 Lucene 进行封装的。
2.ElasticSearch入门
a.ElasticSearch概述
ElasticSearch 就是基于 Lucene 进行封装的
Lucene 是一套信息检索工具包,并不包含搜索引擎系统。(索引结构,读写索引工具、分析、排序…)
ElasticSearch
相关文章:https://www.zhihu.com/topic/19899427/top-answers
思考:原来的搜索: Select * from xxx where xx = xxx,(使用 SQL 查询)
大数量下,索引失效了,就是十分的慢?真正的大数据搜索都不会直接使用SQL。
ElasticSearch为什么会诞生?
ElasticSearch创始人 => 妻子(厨师)=> (大量的菜谱)=> 食谱搜索引擎(Lucene)=> 发布了第一个版本(Compass)=> 找工作 => 分布式环境=> 需求:高性能的、实时的、分布式的搜索引擎 = > Compass 重写 => ElasticSearch?
ElasticSearch现在的状态?
第一个版本:2010年2月。开源在 Github上。
获取途径: https://www.elastic.co/cn/downloads/elasticsearch
文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/7.x/getting-started.html
ElasticSearch 如何用以及它的思想是最重要的。
3.ES 和 Solr 区别
a.Solr 简介
Solr 是 Apahce下的顶级开源项目,Java开发的,也是基于Lucene封装的全文搜索服务器。
Solr 提供的功能:大量的配置、索引进行了优化。
Solr 独立运行的服务器
Solr 使用方式:Post 方法发送一个 请求 Xml 文档、 添加、删除、更新。。。。 GET 请求来进行查询(Xml, json数据)
b.ES 简介
ElasticSearch 是一个实时分布式搜索和分析引擎,在大数据领域使用十分广泛。
比如百度搜索高亮,商品搜索…
实时搜索,效率十分高(倒排索引)
ElasticSearch 是一个基于 Apahce Lucene下的开源搜索引擎。
c.Lucene 简介
Lucene 是一个开源的全文检索引擎工具包。 查询引擎、索引引擎、文本分析。
正常开发中,现在很少去直接使用 Lucene 来实现全文检索了。
全文检索?
Baidu、Google、 Github : 都是通过从互联网上提取的各个网站的信息(网页文字文字),将这些信息建立到数据库中。
数据的来源?
爬虫,主动收集
数据库中的内容
清洗完毕的数据
…
数据来源十分多(搞懂这些数据是如何存储和操作的。)
d.ElastichSearch 和Solr性能对比
当单纯的对已有数据进行搜索时,Solr更快。
Search Fesh Index While Idle
当实时建立索引时, Solr会产生io阻塞,查询性能较差, Elasticsearch具有明显的优势。
search_fresh_index_while_indexing
随着数据量的增加,Solr的搜索效率会变得更低,而Elasticsearch却没有明显的变化。
search_fresh_index_while_indexing
综上所述,Solr的架构不适合实时搜索的应用。
性能对比转载自:https://www.jianshu.com/p/e00307c2125d
e.ES VS Solr
1、ES 开箱即用。Solr就会相对复杂一点点
2、Solr使用利用 Zookeeper来进行分布式管理。ES 自带分布式协调管理功能
3、Solr 支持的数据格式比较多(XML、JSON),ES 仅仅支持 JSON。
4、Solr 的官方的提供的功能的更多。ES 更加注重 核心功能,它拥有良好的插件机制。高级功能,都是可以使用第三方插件提供。
5、Solr查询更快,索引更新时候很慢(插入和删除慢)。
- ES建立索引快(查询相对就会慢些),实时查询会比较快。
- Solr 是一个比较传统的应用解决方案。ES 相对来说就比较少了
6、Solr生态和用户比较大。ES相对来说比较少(版本更新快,很多人还在用旧版本,学习成本也比较高)
4.ElasticSearch 概念理解
Lucene是由一个Java语言开发的开源全文检索引擎工具包。把Lucene用Netty封装成服务,使用JSON访问就说是Elasticsearch。
Elasticserach内置了对分布式集群和分布式索引的管理,所以相对Solr来说,不需要额外安装Zookeeper,其更容易分布式部署。
使用Elasticsearch的搜索系统整理架构图如下所示:
一个ES实例也属于一个集群
Elasticsarch的每一个运行实例称为一个节点,即可以在同一台计算机上运行多个实例,也可以在每台计算机上只运行一个实例。
在一个分布式系统里,多个ES运行实例可以组成一个集群(cluster),该集群里有一个动态选举出来的主节点。如果主节点失败,会自动选出新的节点做为主节点,所以不存在单点故障。自动化的,很智能。
在同一个子网内,只需要在每个节点上设置相同的集群名,这些集群名相同的节点会自动组成一个集群。ES包含了节点和节点之间的通信模块及节点之间的数据分配和平衡模块。
为了实现容错,ES会把查询文档集合分解为多个小的索引,每一个小的索引就叫做分片(shards)。每一个分片都可以有0到多个副本(replicas),而每一个副本也都是分片的完整复制品,这样也提高了查询速度。
一旦ES的某个节点数据损坏或者服务不可用的时候,就可以用其他的节点来代替坏掉的节点,以达到高可用的目的。当有节点加入或者退出时,主节点会根据机器的负载对索引分片进行重新分配,当“挂掉”对节点再次重现启动对时候也会进行数据恢复(recovery)。
ES通过网关(Gateway)来管理集群恢复,可以配置集群需要加入多少节点才能启动恢复数据。网关配置用于恢复任务失败的索引。当节点崩溃并重新启动时,ES将从网关读取所有的索引和元数据。
a.ES几个关键词理解
-
索引:
ES将它的数据存储在一个或者多个索引中。用sql领域的术语来类比,索引就像数据库,可以向索引写入文档或者从索引中读取文档,并通过ES内部使用的Lucene将数据写入索引或从索引中检索数据。
索引是具有某些类似特征的文档集合,索引由名称标识(必须全部小写)。
-
文档:
文档是可以建立索引的基本信息单元。例如,您可以为单个客户提供文档,为单个产品提供一个文档,为单个订单提供一个文档。该文档以JSON(JavaScript Object Notation)表示,JSON是一种普遍存在的互联网数据交换格式。
在索引/类型中,您可以根据需要存储任意数量的文档。请注意,尽管文档实际上驻留在索引中,但实际上必须将文档编入索引/分配给索引中的类型。
-
映射(mapping):
ES中的索引模式叫做Mapping。索引中的每个文档都有一个type,每个type拥有自己的模式或者模式定义。
用户可以设置一些参数,来决定如何将输入文本分割为词条,哪些词条应该被过滤掉,或者哪些附加处理时有必要被调用的。如排序时所需的字段内容信息,者就是mapping扮演的角色。
-
类型:
ES中每个文档都有与之对应的类型定义。这允许用户在一个索引中存储多种文档类型,并为不同文档类型提供不同的映射。
-
节点:
单个的ES服务实例称为节点(node)。很多时候部署一个ES节点就足以应付大多数简单的应用,但是考虑到容错性或在数据膨胀到单机无法应付这些状况时,你也许会更倾向于使用多节点的ES集群。
b.ES集群:
集群(cluster)是一组具有相同cluster.name的节点集合,他们协同工作,共享数据并提供故障转移和扩展功能,当然一个节点也可以组成一个集群。
集群由唯一名称标识,默认情况下为“elasticsearch”。此名称很重要,因为如果节点设置为按名称加入集群的话,则该节点只能是集群的一部分。
确保不同的环境中使用不同的集群名称,否则最终会导致节点加入错误的集群。
集群状态通过 绿,黄,红 来标识:
绿色 - 一切都很好(集群功能齐全)。
黄色 - 所有数据均可用,但尚未分配一些副本(集群功能齐全)。
红色 - 某些数据由于某种原因不可用(集群部分功能)。
注意:当群集为红色时,它将继续提供来自可用分片的搜索请求,但您可能需要尽快修复它,因为存在未分配的分片。
c.ES分片:
索引可能存储大量可能超过单个节点的硬件限制的数据。例如,占用1TB磁盘空间的十亿个文档的单个索引可能不适合单个节点的磁盘,或者可能太慢而无法单独从单个节点提供搜索请求。
为了解决这个问题,Elasticsearch 提供了将索引细分为多个称为分片的功能。创建索引时,只需定义所需的分片数即可。每个分片本身都是一个功能齐全且独立的“索引”,可以托管在集群中的任何节点上。
设置分片的目的及原因主要是:
-
它允许您水平拆分/缩放内容量;
-
它允许您跨分片(可能在多个节点上)分布和并行化操作,从而提高性能/吞吐量;
-
分片的分布方式以及如何将其文档聚合回搜索请求的机制完全由 Elasticsearch 管理,对用户而言是透明的。
在可能随时发生故障的网络/云环境中,分片非常有用,建议使用故障转移机制,以防分片/节点以某种方式脱机或因任何原因消失。为此,Elasticsearch 允许您将索引的分片的一个或多个副本制作成所谓的副本分片或简称副本。
d.ES副本:
副本,是对分片的复制。目的是为了当分片/节点发生故障时提供高可用性,它允许您扩展搜索量/吞吐量,因为可以在所有副本上并行执行搜索。
总而言之,每个索引可以拆分为多个分片。索引也可以复制为零次(表示没有副本)或更多次。复制之后,每个索引将具有主分片(从原始分片复制而来的)和复制分片(主分片的副本)。
可以在创建索引时为每个索引定义分片和副本的数量。创建索引后,您也可以随时动态更改副本数,但这不是一项轻松的任务,所以预先计划正确数量的分片是最佳方法。
默认情况下,Elasticsearch 中的每个索引都分配了5个主分片和1个副本,这意味着如果集群中至少有两个节点,则索引将包含5个主分片和另外5个副本分片(1个完整副本),总计为每个索引10个分片。
e.ES网关:
在ES的工作过程中,关于集群状态,索引设置的各种信息都会被收集起来,并在网关(gateway)中被持久化