什么是Elasticsearch? 官网的回答:You know, for search (and analysis)
Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。
在 Elastic Stack 中, Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。Kibana 使您能够以交互方式探索、可视化和分享对数据的见解,并管理和监控堆栈。
Elasticsearch 为所有类型的数据提供近乎实时的搜索和分析。
无论您拥有结构化或非结构化文本、数字数据还是地理空间数据,Elasticsearch 都能以支持快速搜索的方式高效地存储和索引它。您可以超越简单的数据检索和聚合信息来发现数据中的趋势和模式。
官方给出的用例场景包括但不限于以下:
- 向应用或网站添加搜索框
- 存储和分析日志、指标和安全事件数据
- 使用机器学习实时自动建模数据行为
- 使用 Elasticsearch 作为存储引擎自动化业务工作流程
- 使用 Elasticsearch 作为地理信息系统 (GIS)管理、集成和分析空间信息
- 使用 Elasticsearch 作为生物信息学研究工具来存储和处理遗传数据
文档和索引 (document and index)
分布式文档存储
Elasticsearch 是一个分布式文档存储。Elasticsearch 不是将信息存储为列式数据行,而是存储已序列化为 JSON 文档的复杂数据结构。倒排索引
存储文档后,它会在"近乎实时的搜索",被索引并完全可搜索——在1 秒内。Elasticsearch 使用一种称为倒排索引的数据结构,它支持非常快速的全文搜索。倒排索引列出了出现在任何文档中的每个唯一单词,并标识了每个单词出现的所有文档。-
索引
ES中的索引不同于mysql中的概念, 在这里,索引被定义为文档的一个优化集合。 类似的, 可以把 ES中的文档比作mysql中的行, 则索引相当于mysql中的表或数据库。索引 == 文档的优化集合,文档 == 字段的集合,字段是包含数据的键值对。
默认情况下,Elasticsearch 索引每个字段中的所有数据,并且每个索引字段都有一个专用的优化数据结构。例如,文本字段存储在倒排索引中,而数字和地理字段存储在 BKD 树中。使用每个字段的数据结构来组装和返回搜索结果的能力是 Elasticsearch 如此快速的原因。
映射 (mapping)
Elasticsearch 的 sechema 具有 动态映射 和 显式映射 两种模式。
动态映射 (Dynamic mapping)
无需明确指定如何处理文档中可能出现的每个不同字段即可对文档进行索引。启用动态映射后,Elasticsearch 会自动检测新字段并将其添加到索引中。这种默认行为使索引和探索数据变得容易——只需开始索引文档,Elasticsearch 就会检测并将布尔值、浮点和整数值、日期和字符串映射到适当的 Elasticsearch 数据类型。-
显式映射 (Explicit mapping)
可以定义规则来控制动态映射并显式定义映射以完全控制字段的存储和索引方式。
定义自己的映射使您能够:- 区分全文字符串字段和精确值字符串字段
- 执行特定语言的文本分析
- 优化字段以进行部分匹配
- 使用自定义日期格式
- 使用无法自动检测到 geo_point的数据类型geo_shape
可扩展性
弹性负载分布
Elasticsearch 通过将索引中的文档分布在多个分片上,并将这些分片分布在多个节点, 从而可以达到冗余防止硬件故障。 同时Elasticsearch 会自动将数据和查询负载分布到所有可用节点上, 平衡多节点集群以提供可扩展性和高可用性。-
分片
分片有两种类型:主分片和副本分片。索引中的每个文档都属于一个主分片。副本分片是主分片的副本。副本分片提供数据冗余以防止硬件故障 并 增加处理读取请求(如搜索或检索文档)的容量。
索引中主分片的数量在创建索引时是固定的,但副本分片的数量可以随时更改,而不会中断索引或查询操作。分片和节点数量应取决于业务数据量!!!- 分片越多,维护这些索引的开销就越大。
- 分片大小越大,当 Elasticsearch 需要重新平衡集群时,移动分片所需的时间就越长。
- elasticsearch 会把查询任务分配给各个分片,然后通过合并汇聚各个分片的结果,从而得到最终结果, 查询更多数据意味着需要更大的开销。因此并不是分片大小越大或分片数量越多,查询便会更快,这完全取决于数据量。