You Know, for Search
Elasticsearch是分布式,高性能,高可用,可伸缩的搜索和分析系统。
Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。
Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库—无论是开源还是私有。但是 Lucene 仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 糟糕的是,您可能需要获得信息检索学位才能了解其工作原理。Lucene 非常复杂。
Elasticsearch 也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。
Elasticsearch 将所有的功能打包成一个单独的服务,这样你可以通过程序与它提供的简单的 RESTful API 进行通信, 可以使用自己喜欢的编程语言充当 web 客户端,甚至可以使用命令行(去充当这个客户端)。
就 Elasticsearch 而言,起步很简单。对于初学者来说,它预设了一些适当的默认值,并隐藏了复杂的搜索理论知识。 开箱即用 。只需最少的理解,你很快就能具有生产力。
Lucene
一个jar包,里面包含了封装好的各种建立倒排索引,以及进行搜索的代码,包括各种算法。我们就用java开发的时候,引入lucene jar,然后基于lucene的api进行去进行开发就可以了。用lucene,我们就可以去将已有的数据建立索引,lucene会在本地磁盘上面,给我们组织索引的数据结构。
lucene,最先进、功能最强大的搜索库,直接基于lucene开发,非常复杂,api复杂(实现一些简单的功能,写大量的java代码),需要深入理解原理(各种索引结构)
elasticsearch,基于lucene,隐藏复杂性,提供简单易用的restful api接口、java api接口(还有其他语言的api接口)
(1)分布式的文档存储引擎
(2)分布式的搜索引擎和分析引擎
(3)分布式,支持PB级数据
开箱即用,优秀的默认参数,不需要任何额外设置,完全开源
倒排索引
1.创建文档列表:
2.创建倒排索引列表:对文档中数据进行分词,得到词条。对词条进行编号,以词条创建索引,最后保存。
3.搜索的过程:
当用户输入任意的词条时,首先对用户输入的数据进行分词,得到用户要搜索的所有词条,然后拿着这些词条去倒排索引列表中进行匹配。找到这些词条就能找到包含这些词条的所有文档的编号。
然后根据这些编号去文档列表中找到文档
elasticsearch核心概念
近实时 NRT
Elasticsearch 是一个近实时的搜索平台。这也就意味着,文档从被索引到真正能被搜索有一个简短的延迟(通常是 1 秒)。
集群 Cluster
集群,即一个或多个节点(servers)的集合,它承载了我们保存的所有数据,并提供了在所有节点索引和搜索的能力。每个集群拥有一个唯一的名称标识,默认的名称为 "elasticsearch"。这个名字非常重要,每个节点只能加入到一个集群,而每个节点能否成为某集群的一部分,就是由这个名字决定的。
节点 Node
节点是一个单一的服务,同时也是集群的一部分,负责保存数据,集群的索引和搜索能力需要各个节点的参与。和集群一样,每个节点也有自己的名字,节点的名称默认是通过 UUID 随机产生的,在节点启动时,会为其分配一个名称。如果不希望使用默认生成的名称,也可以自定义。这个名字也很重要,集群会通过它们来标识每个节点,在进行集群管理时,要知道哪些节点属于某个集群同样需要节点名称来识别。
默认节点会去加入一个名称为“elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群
索引 Index
索引,是有着相似性的文档的一组集合。怎么理解呢?举个例子,你可以用一个索引存储消费者一类的数据,一个索引保存商品类信息、还有一个索引保存订单数据。 每个索引都是通过名称(必须是小写)来识别的。当我们对某个索引中文档数据执行一些操作时,比如索引、搜索、更新和删除时,也要通过名字识别。
一个集群可以定义任意多个索引。
类型 Type
注:Type 在 Elasticsearch 6.0 已经被弃用了。不再支持多个类型
类型是用于在索引上实现一种逻辑上的分类/分区,这让我们可以在一个索引中存储不同类型的文档,比如,user 类型,blog 类型。但是,在 6.0 以后, 已经不支持在一个创建多个 Type 类型了,而且,Type 类型这个概念将会在下一个版本,也就是 7.0 彻底移除。
文档 Document
文档是 Elasticsearch 中能被索引的最小信息单元。比如,你可以用一个文档表示一个消费者,一个文档表示一个商品,还有一个文档表示一笔订单。文档是以 JSON 格式表示的,这是一种很常用的数据格式。
在一个索引/类型中,我们可以保存任意多个文档。要说明的是,虽然物理意义上,文档是保存在索引中的,但当前版本(6.5),一个文档的保存必须要指定索引/类型。
分片和副本 Sharps & Replica
shard:单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。每个shard都是一个lucene index
replica:任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。primary shard(建立索引时一次设置,不能修改,默认5个),replica shard(随时修改数量,默认1个),默认每个索引10个shard,5个primary shard,5个replica shard,最小的高可用配置,是2台服务器。
拓展:可扩展架构的方法论——AKF扩展立方体
AKF扩展立方体(Scalability Cube),是《架构即未来》一书中提出的可扩展模型,
这个立方体有三个轴线,每个轴线描述扩展性的一个维度,他们分别是产品、流程和团队:
X轴 —— 代表无差别的克隆服务和数据,工作可以很均匀的分散在不同的服务实例上;
Y轴 —— 关注应用中职责的划分,比如数据类型,交易执行类型的划分;
Z轴 —— 关注服务和数据的优先级划分,如分地域划分。
ElasticSearch完整目录
1. Elasticsearch是什么
2.Elasticsearch基础使用
3.Elasticsearch Mapping
4.Elasticsearch 集群原理
5.Elasticsearch Scripts和读写原理
6.Elasticsearch 分词器
7.Elasticsearch TF-IDF算法及高级查询
8.Elasticsearch 地理位置及搜索
9.Elasticsearch ELK