Elasticsearch 学习记录(一)
基本概念和术语
-
什么是 ES
ES 是一个基于全文搜索引擎库 Apache Lucene 做出来的开源分布式搜索引擎,使用 JAVA 编写,隐藏了 Luncene 的复杂性,提供了简单 RESTFUL API 接口访问。 -
什么是文档
ES 是面向文档的,文档代表的就是数据,也可以理解为 MySQL 中的记录,但是 ES 不是使用行列存储数据。ES 的文档采用 JSON 对象的形式存储,当集群中有多个 ES 节点时,存储的文档会分布在整个集群中,并且可以从任何节点立即访问。 -
什么是索引
索引可以被认为是文档的优化集合,每个文档都是字段的集合,字段是包含数据的键值对。默认情况下,ES 索引每个字段中的所有数据,并且每个索引字段都有一个专用的优化数据结构。 -
搜索数据
ES 支持通过 RESETFUL API 查询结构化数据、全文查询,和两者结合的复杂查询。 -
分析数据
ES 可以聚合查找复杂数据,并同时进行过滤结果和数据分析,因为聚合利用了用于搜索的相同数据结构,所以它们也非常快。 -
节点
指已经部署了 ES 的服务器,节点可以指定身份,用以标识在集群中的角色,分为:
1、node.master :主节点,可以管理整个集群的设置及变化:创建、更新、删除索引,添加节点,为节点配置分片
2、node.data :数据
3、node.ingest :数据接入
4、node.ml :机器学习 -
集群
由一个或多个节点组成,可以通过集群名称进行标识,在 elasticsearch.yml 配置文件中的 cluster.name 设置 -
分片
1、ES 用于存储文档的容器,可以进行复制以提供数据冗余副本,防止硬件故障造成数据不能访问的情况。
2、分片可以分布在集群中不同的节点上,由 ES 自动管理分片的排序
3、分片可以很方便的支持水平扩容
4、分片可以进行分布式、并行的操作,从而提高性能和吞吐量 -
分片类型
1、主分片:每个文档都存储在主分片上,索引文档时,首先在主分片上编制索引,然后在此分片的所有副分片上编制索引,索引可以包含一个或多个主分片,一旦创建索引,主分片数量就无法修改了。
2、副分片:每个主分片可以具有零个或多个副本,可以实现故障转移,当主分片无法工作时将副分片提升为主分片,也可以提高性能。 -
倒排索引
ES 中的索引结构,它由文档中所有不重复词的列表构成,适合快速的全文搜索,这也是比关系型数据库更适合做全文索引的重要原因。
假设有两个文档,每个文档的正文字段包含如下内容:
1、The quick brown fox jumped over the lazy dog
2、Quick brown foxes leap over lazy dogs in summer
倒排索引创建时,会将每个文档的正文字段拆分成单独的词(称为词条或Tokens),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。
词条 | 文档1 | 文档2 |
---|---|---|
Quick | ✓ | |
The | ✓ | |
brown | ✓ | |
dog | ✓ | |
dogs | ✓ | |
fox | ✓ | |
foxes | ✓ | |
in | ✓ | |
jumped | ✓ | |
lazy | ✓ | |
leap | ✓ | |
over | ✓ | |
quick | ✓ | |
summer | ✓ | |
the | ✓ |
默认情况下,ES 文档每个字段都会被索引,如果某些字段不需要支持查询,可以在映射中配置 "index": false,减少存储空间占用,并且提升写入速度。
-
文档值
在 ES 中,文档值(Doc Values)是一种列式存储结构,在索引时创建,文档值默认对除 text 和 annotated_text 类型以外的所有字段启用。文档值常被应用到以下场景:
1、对一个字段进行排序
2、对一个字段进行聚合
3、地址位置过滤
4、脚本计算
5、使用 docvalue_fields 返回搜索结果部分字段值
如果确定数据集中的某些字段不会应用以上场景,也可以选择禁用文档值,这样不仅可以节省磁盘空间,也会提升索引的速度,通过 mapping 设置 doc_values:false即可。