Elasticsearch 基础概述
Elasticsearch 是一个基于 Lucene 的分布式搜索引擎。它提供了 HTTP Web 界面和无架构(Schema-less)的 JSON 文档处理能力,支持多租户环境下的全文搜索。Elasticsearch 使用 Java 开发,遵循 Apache 许可条款开源发布。
在文档层面,我们可以执行以下基本操作:
- 创建:将文档索引到 Elasticsearch 中。
- 读取:检索已存储的文档内容。
- 更新:修改现有文档的内容。
- 删除:移除不需要的文档。
核心数据结构:倒排索引
倒排索引是搜索引擎的核心组件。其主要目标是在海量数据中快速定位包含特定搜索条件的文档。简单来说,它将单词映射到包含该单词的文档列表,类似于书籍末尾的索引页,通过关键词直接找到对应的页码。
例如,对于文本'JavaInUse 是一个很好的网站',系统会将其标记为独立的术语(Terms),并记录每个术语出现的文档 ID 及位置。当用户搜索'网站'时,系统直接查询倒排索引,迅速识别出包含该词的文档,而无需遍历所有文件。
集群架构与层级关系
理解 Elasticsearch 的层级结构至关重要:
- 集群(Cluster):由一个或多个节点组成,共同保存数据并提供联合索引和搜索功能。集群名称必须唯一,默认值为
elasticsearch。只有名称匹配的节点才能加入同一集群。 - 节点(Node):集群中的单个服务器实例,负责存储数据和参与索引/搜索任务。
- 索引(Index):类似于关系型数据库中的'数据库'。它是逻辑名称空间,映射到一个或多个主分片,并可配置多个副本分片。
- 文档(Document):对应数据库中的一行数据。不同之处在于,Elasticsearch 中的每个文档可以具有不同的字段结构(动态映射),但通用字段应保持相同的数据类型。
- 类型(Type):注:在较新版本中已被弃用。这是索引的逻辑分区,语义完全取决于用户定义。在早期版本中,一个索引可包含多种类型。
无架构特性与映射管理
Elasticsearch 通常被称为'无架构'或'模式灵活'的数据库,这意味着可以在不明确定义字段类型的情况下索引文档。如果未指定映射(Mapping),Elasticsearch 会在索引期间自动检测新字段并动态生成映射。不过,为了优化性能和确保数据类型正确,建议在生产环境中显式定义 Mapping。
分片与副本机制
由于 Elasticsearch 是分布式的,索引会被分割成多个分片(Shard),这些分片分布在不同的节点上,以实现水平扩展和数据分发。
**副本(Replica)**则是分片的完整拷贝。引入副本的主要目的是提高系统的可用性(高可用)和读取性能。如果一个主分片所在的节点宕机,副本分片可以立即提升为主分片,保证服务不中断。
分析器与文本处理
在索引数据时,Elasticsearch 会使用**分析器(Analyzer)**对文本进行转换。分析器由三个部分组成:
- 字符过滤器(CharFilter):可选,用于预处理输入字符串(如去除 HTML 标签)。
- 分词器(Tokenizer):核心组件,负责将字符串拆分为术语流(Tokens)。例如,遇到空格或标点时进行切分。
- 令牌过滤器(Token Filter):对分词后的结果进行处理,如转换为小写、去除停用词等。
Elasticsearch 内置了多种预构建的分析器,也支持组合内置组件创建自定义分析器。
字段属性详解
在定义字段时,有几个关键属性需要注意:
- enabled:控制字段是否被索引。默认为
true。如果设为false,该字段不会被索引,但仍存在于_source中。 - store:决定原始数据是否单独存储。默认情况下,字段不单独存储,但完整的 会保留。如果设置 ,Lucene 会单独存储该字段值,以便后续直接返回,但这会增加存储空间开销。


