基本概念和术语
什么是 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即可。