you know, for search - ElasticSearch 学习笔记

Posted by Littlesqx on December 8, 2017

ElasticSearch 是什么 ?

怒抄一波介绍:

Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。

不过,Elasticsearch不仅仅是Lucene和全文搜索,我们还能这样去描述它:

  • 分布式的实时文件存储,每个字段都被索引并可被搜索
  • 分布式的实时分析搜索引擎
  • 可以扩展到上百台服务器,处理PB级结构化或非结构化数据

而且,所有的这些功能被集成到一个服务里面,你的应用可以通过简单的RESTful API、各种语言的客户端甚至命令行与之交互。

高大上的感觉,没关系,来个与传统关系型数据库的类比:

Relational DB ElasticSearch
Databases Indices
Tables Types
Rows Documents
Columns Fields
Schemas Mappings
Index Everything is indexed
SQL(DB Client) Query DSL (RESTful API / Java API)

这在比较多关于ElasticSearch的文章也提到过,甚至包括官方的文档。虽然很能帮助入门理解,然而,官方逐渐意识到了这是一个 bad analogy。

This was a bad analogy that led to incorrect assumptions. In an SQL database, tables are independent of each other. The columns in one table have no bearing on columns with the same name in another table. This is not the case for fields in a mapping type.

In an Elasticsearch index, fields that have the same name in different mapping types are backed by the same Lucene field internally.

理解这段话之前,先理解ElasticSearch里的各种概念

1# 索引 (Index) ** 拥有相似特征的文档的集合。

2# 类型 (Type)

在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组相同字段的文档定义一个类型。 删除线的原因后面补充。

3# 文档 (Document)

一个文档是一个可被索引的基础信息单元。文档以JSON格式来表示。

4# 映射 (Mapping)

映射(mapping)机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型(string, number, booleans, date等)。此外,映射机制也可以给字段绑定使用的字段格式和分析器(analyzer)。 删除原因同上。

5# 近实时 (Near Real Time, NRT)

Elasticsearch 是一个接近实时的搜索平台。从索引一个文档直到这个文档能够被搜索到有一个很小的延迟(通常是 1 秒)。

6# 集群 (Cluster)

一个集群就是由一个或多个节点组织在一起, 它们共同持有你全部的数据, 并一起提供索引和搜索功能。

7# 节点 (Node)

一个节点是你集群中的一个服务器,作为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。

8# 分片和复制 (Shards and Replicas)

Elasticsearch提供了将索引划分成多片的能力,这些片叫做 分片 。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引” 可以被放置到集群中的任何节点上。

分片之所以重要,主要有两方面的原因:

  • 允许你水平分割/扩展你的内容容量
  • 允许你在分片(位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量

Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫 复制

复制之所以重要,有两个主要原因:

  • 在分片/节点失败的情况下,复制提供了高可用性。复制分片不与原/主要分片置于同一节点上是非常重要的。
  • 因为搜索可以在所有的复制上并行运行,复制可以扩展你的搜索量/吞吐量

总之,每个索引可以被分成多个分片。一个索引也可以被复制0次(即没有复制) 或多次。一旦复制了,每个索引就有了主分片(作为复制源的分片)和复制分片(主分片的拷贝)。 分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你不能再改变分片的数量。

补充删除线的原因

官方文档 Elasticsearch Reference [6.0] » Mapping » Removal of mapping types 除了提到了类比传统关系型数据库是一个bad analogy,还提到了关于映射和类型的未来。甚至给出了一个移除时间表。一句话总结,其实自5.6版本后,行动就开始了,现在最新的6.x版本已经不支持一个索引里有多种类型,类型(Type)已经名存实亡,后面的版本将逐步移除映射和类型。

为什么使用ElasticSearch ?

提这么一个小结,对于我这种萌新有点逞强。查阅了资料可以从他的优势和场景回答。

优势:部署和基本使用十分简单,查询快速,性能优越,可扩展,高可用…

场景:搜索、日志、统计、分析、监控…

为什么ElasticSearch那么快,可以参考 ElasticSearch学习笔记 - Neway

自己看完后不是很懂,大概了解到这几个关键点:

Everything is indexed倒排索引利用内存计算FST(Finite State Transducers)压缩技术

怎么使用ElasticSearch ?

下载和安装

请到官方下载。

配置

服务器配置,有几点需要注意:

1# 不能root账号执行,显然是出于安全考虑。解决办法是新建ElasticSearch用户组和用户。

2# Linux用户最大使用进程数。 参考 system-settings

3# vm-max-map-count。参考 vm-max-map-count

4# jvm 内存限制。官方建议设置为机身最大内存的一半,但不超过32G。参考 heap-size

重要的ElasticSearch配置。 important-settings

使用

JAVA API 和 RESTful API。推荐后者,详细见官方文档。

参考文章