[这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战]
一、什么是Elasticsearch
Elasticsearch是一个基于Lucene库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,使用JSON存储数据,支持REST风格的请求。Elasticsearch是用Java开发的,并在Apache许可证下作为开源软件发布。
Elasticsearch包含两个基本的流程:
- 数据输入:文档与索引
- 信息输出:搜索与分析
二、文档与索引
Elasticsearch中存在文档与索引的概念,用于处理输入的数据。
分布式文档存储引擎- 会存储为已序列化为
JSON文档的复杂数据结构。当集群中有多个 Elasticsearch 节点时,存储的文档分布在整个集群中,并且可以从任何节点立即访问。
- 会存储为已序列化为
- 使用
倒排索引- 支持非常快速的全文搜索;倒排索引会列出在任意文档中出现的
唯一单词,并标识出现在文档中的每个单词。
- 支持非常快速的全文搜索;倒排索引会列出在任意文档中出现的
动态映射(dynamic mapping)- Elasticsearch可以根据待索引数据自动建立索引、自动定义映射类型;支持布尔值、浮点和整数值、日期和字符串等类型的自动映射
- 在不明确如何处理文档中可能出现数据类型时,可以启动动态映射;
- 支持自定义映射
ES中存在
索引概念,表示文档的优化集合;每个文档都是字段集合,包含了数据的键值对。
三、搜索与分析
Elasticsearch构建在 Apache Lucene 搜索引擎库上,可以提供全套搜索功能。Elasticsearch 提供了一个简单一致的 REST API 来管理集群、索引和搜索数据。支持多种语言:
- Java
- JavaScript
- Go
- .NET
- PHP
- Perl
- Python
- Ruby
Elasticsearch REST API 支持多种查询方式:
- 结构化查询:类似于sql查询,支持字段值查询、匹配度查询
- 全文查询:查找与
查询字符串匹配的所有文档,并按相关性排序返回 - 复杂查询:结合了结构化查询与全文查询
除了搜索单个术语外,还可以执行短语搜索、相似性搜索和前缀搜索。Elasticsearch 支持高效地在地理和数值查询的优化数据结构中索引非文本数据。
Elasticsearch 聚合使开发者能够构建复杂的数据摘要并深入了解关键指标、模式和趋势。
四、拓展性与弹性搜索
Elasticsearch 旨在始终可用并支持根据需求进行扩展,可以将服务器(节点)添加到集群以增加容量,Elasticsearch 会自动在所有可用节点之间分配您的数据和查询负载。
Elasticsearch 索引实际上只是一个或多个物理分片的逻辑分组,其中每个分片实际上是一个独立的索引。通过将索引中的文档分布在多个分片中,并将这些分片分布在多个节点上,Elasticsearch 可以确保冗余,这既可以防止硬件故障,又可以在将节点添加到集群时增加查询容量。
ES存在主、副两种分片,索引中的每个文档都归属于一个主分片,而副分片是主分片的副本。
- 优点
- 副本提供数据的冗余副本,以防止硬件故障并增加处理读取请求(如搜索或检索文档)的容量。
- 缺陷
- 分片越多,维护索引的开销越大;
- 查询大量小分片会使每个分片的处理速度更快,但更多查询意味着更多开销。
- 设置分片的方法
- 分片数量与可用空间成正比,需要按实际数据进行测试
索引中的主分片数量在创建索引时是固定的,但副本分片的数量可以随时更改,而不会中断索引或查询操作。值得一提的是,当集群添加新的节点时,分片会进行动态调整,会按照负载转移到其他节点上。