之前接触了janus,从架构就知道它底层存储依赖两个.主要是cassandra和elasticsearch(es),那么今天来了解一下es本身. [elastic : 弹性的]
参考 : elasticsearch权威指南 (gayhub有翻译小组) , zhihu-ES专栏 (进阶使用)
0x00.前身
ES出现于2010年,是基于Apache的开源搜索引擎Lucene(注意: **读音类似Lu-seen **) 改造而来.(同样基于的还有Solr[‘səulə],但是应该已经被es后来居上了据说Lucene的设计理念,性能,功能都很好. 有待考证..:) 但是由于lucene只是一个java写的库,使用复杂麻烦.需要深入了解搜索的相关知识才能使用好.
ES基于Lucene的核心来实现所有索引和搜索的功能,然后封装为RESTfull API便以访问,是的全文搜索之类的变得简单许多.可以在笔记本(单点弱性能),也可以在大规模集群上分布式存储并实时的计算. 它安装简单,用户可以无需了解搜索底层即可生成环境使用. (补充: K8S上的日志收集EFK中的核心E就是elasticsearch,也是因为它的这种微服务特性和良好封装性.)
ES核心三大功能 : 全文检索 , 结构化搜索 , 数据分析聚合. 并将它们简单混搭使用(主要特点).wiki/github/stackoverflow等企业都在使用es检索大量数据.
首先可以简单直观的理解: ES = SearchEngine + NosqlDB (也就是搜索引擎+数据库 两个核心组成,可以单独使用,也可以组合使用.)
0x01.索引
说数据存储,不例外的要先说数据类型.比如常见的 K-V、关系型、对象型. ES 主要使用的是 JSON 文档模型。
1 | //json大家应该都比较熟了,就只简单列个各种组合都有的例子. |
es 会对 JSON 字段建立索引,但是否可检索、可聚合由 mapping 决定。index 在 ES 语境里有三层含义:
Index:
- 名词:类似逻辑数据集合(可类比关系库里的“库/表组合”)。
- 动词:把文档写入并建立检索结构(
index a document)。 - 索引结构:ES 主要依赖倒排索引实现全文检索。
还需要补一个经常混淆的四元组:index -> shard -> replica -> document。
- primary shard:主分片,负责写入与主数据存储;
- replica shard:副本分片,提供高可用与查询扩展;
- document:最终被索引与检索的 JSON 文档。
flowchart LR
A["index: blog"] --> B["primary shard 0"]
A --> C["primary shard 1"]
B --> D["replica shard 0"]
C --> E["replica shard 1"]
B --> F["documents"]
C --> F
一个最小 mapping 示例(显式声明字段类型,避免动态映射误判):
1 | PUT /blog |
默认情况下(动态映射场景)大部分可检索字段会被建立索引;如果字段显式配置 index: false,就无法参与检索。
0x02.搜索
ES 搜索通常是“全文匹配 + 结构化过滤”的组合。一个常见的写法是 bool 查询:
1 | GET /blog/_search |
实践注意:
match走分词与相关性打分,适合全文检索;term走精确匹配,适合keyword字段;- ES 是 near real-time 引擎,写入后可检索存在刷新延迟(默认刷新周期可配置)。
0x03.聚合
聚合是 ES 很强的一部分,可在检索结果上做统计分析。常见的 terms + date_histogram:
1 | GET /blog/_search |
如果你把 ES 作为日志/指标检索后端,通常就是“全文检索 + 聚合统计”一起使用。
0x0n.更新补充
- “ES 基于 Lucene”与“REST API 对外提供检索服务”结论已按官方资料核验。
- 文中示例基于 ES 8 常见 DSL 风格,字段命名和 mapping 需按实际业务调整。
- 历史教程里常见的“type/typeName”写法在新版本已不再推荐,迁移时注意版本差异。