Elasticsearch--自带“搜索引擎“的数据库

一、核心原理

1. 倒排索引(Inverted Index)

  • 基本概念
    将文档中的每个词条(term)映射到包含它的文档列表上,正如图书馆目录将关键词映射到书籍编号。
  • 工作流程
    • 分词(Analysis):文本切分成最小单元(token),可配置多种分词器(标准、IK、英文 Porter 等)。
    • 归一化:对 token 执行小写化、去停用词等处理。
    • 构建倒排表:为每个 token 维护一张 posting list,记录它出现在哪些文档、哪些位置。

2. 文档存储与索引

  • JSON 文档
    Elasticsearch 以 JSON 格式存储每个记录(document),字段无需预定义即可动态添加,体现了高度的灵活性。
  • Mapping
    用户可显式地为字段定义类型(textkeyworddateinteger 等)、分词器及索引选项,实现对索引行为的精细控制。

3. 集群架构

  • 节点(Node)与集群(Cluster)
    多台机器(或容器)运行 Elasticsearch,组成一个集群,通过协调节点(master)管理全局元数据。
  • 分片(Shard)和副本(Replica)
    • 主分片:将一个索引水平拆分为 N 个主分片,每个分片本质上就是一个独立的 Lucene 索引。
    • 副本分片:为每个主分片配置 M 个副本,用于高可用和读扩展。
    • 数据路由 :文档根据 _id 哈希分配到某个主分片,然后副本同步该数据。

4. 查询与打分

  • 查询 DSL
    JSON 格式的 Query DSL,支持 matchtermboolrangeaggregations 等丰富查询。
  • 相关性评分(TF-IDF / BM25)
    基于词频-逆文档频率(TF-IDF)和文档长度归一化技术(BM25),按相关度对结果进行排序。

5. 聚合(Aggregations)

  • 桶聚合(Bucketing) :如 terms(按字段分组)、histogram(按数值区间分组)等。
  • 指标聚合(Metric) :如 avgsumminmaxstats 等,可在桶内或全局计算统计指标。

二、典型使用模式

1. 部署与启动

  • 单节点开发 (Docker):

    bash 复制代码
    docker run -d --name es -p 9200:9200 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:8.6.0
  • 生产多节点 :通过 discovery.seed_hostscluster.initial_master_nodes 等配置,组建多节点集群。

2. 建立索引与 Mapping

bash 复制代码
curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
  "mappings": {
    "properties": {
      "title":   { "type": "text", "analyzer": "standard" },
      "tags":    { "type": "keyword" },
      "created": { "type": "date" }
    }
  }
}'

3. 文档操作

  • 插入

    bash 复制代码
    curl -X POST "localhost:9200/my_index/_doc/1" -H 'Content-Type: application/json' -d'
    { "title":"Elasticsearch入门", "tags":["搜索","日志"], "created":"2025-04-01" }
    '
  • 更新

    bash 复制代码
    curl -X POST "localhost:9200/my_index/_update/1" -H 'Content-Type: application/json' -d'
    { "doc": { "title":"深入理解 Elasticsearch" } }
    '
  • 删除

    bash 复制代码
    curl -X DELETE "localhost:9200/my_index/_doc/1"

4. 查询与聚合

  • 全文检索

    bash 复制代码
    curl -X GET "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
    {
      "query": {
        "match": { "title": "Elasticsearch" }
      }
    }
    '
  • 聚合示例:按日期分桶并统计文档数

    bash 复制代码
    curl -X GET "localhost:9200/my_index/_search?size=0" -H 'Content-Type: application/json' -d'
    {
      "aggs": {
        "by_month": {
          "date_histogram": {
            "field": "created",
            "calendar_interval": "month"
          }
        }
      }
    }
    '

5. 监控与运维

  • Kibana:Elasticsearch 的官方 Web UI,提供管理界面、Dev Tools、可视化仪表盘。
  • Beats & Logstash:数据采集与管道工具,常用于日志、指标、网络数据的采集与预处理。
  • X-Pack:安全、监控、报警等商业插件(部分功能现已开源到 Basic 版)。

三、与同类产品对比

特性 Elasticsearch Apache Solr OpenSearch Algolia
底层引擎 Lucene Lucene Lucene 自研引擎
部署方式 单节点/集群 单节点/集群 单节点/集群 云托管
配置管理 REST API XML + REST API 与 ES 几乎兼容 Dashboard + API
安全认证 X-Pack 安全 Kerberos、JWT 支持 内置安全(原 ES X-Pack) API Key 管理
查询DSL JSON JSON、Solr Query DSL JSON (兼容 ES DSL) 简化 API
向量检索 支持(dense/sparse) 需插件 支持 支持
社区与生态 强大、商业版 历史悠久、社区活跃 AWS 赞助、社区发展中 SaaS 化,低运维成本
  • Solr vs ES
    • Solr 配置更偏向 XML,启动依赖 ZooKeeper;ES 原生 REST 化、自动分片、易于水平扩展更适合云原生。
  • OpenSearch vs ES
    • OpenSearch 是 AWS 从 ES 7.10 分叉后维护的开源版本,与 ES 绝大多数 API 兼容,适合 AWS 用户。
  • Algolia vs ES
    • Algolia 是纯 SaaS 全文检索服务,零运维、延迟极低,但对大规模自由查询或自定义聚合能力不如 ES 灵活。

四、优势总结

  1. 高度可扩展:自动分片与副本机制,轻松实现从单节点到千节点扩容。
  2. 丰富查询能力:支持全文检索、精确匹配、布尔组合、多字段、多语言分词、多种聚合。
  3. 实时性:近实时(NRT)架构,文档写入后秒级可查询。
  4. 生态完善:Kibana、Beats、Logstash、Elastic APM 等生态工具,覆盖数据采集、监控、可视化全链路。
  5. 混合场景支持:除了日志与搜索,还可做实时指标分析、向量搜索、SIEM 安全事件管理等。

结语

通过对 Elasticsearch 原理、使用方式和同类对比的深入剖析,可以看到它在全文检索与实时分析领域的强大之处。但在低资源环境或纯云 SaaS 场景下,也可根据需求灵活选择 Solr、OpenSearch 或 Algolia 等方案。希望本文能为你在选型与落地实践中提供有价值的参考。

相关推荐
rrrjqy4 分钟前
Redis常见问题(一)
数据库·redis·缓存
Humbunklung5 分钟前
WMO 天气代码(Code Table 4677)深度解析与应用报告
开发语言·数据库·python
道清茗15 分钟前
【MySQL知识点问答题】锁机制、索引优化与数据库恢复方法
数据库·mysql
hero.fei27 分钟前
排查redis出现报错ERR redis temporary failure
数据库·redis·缓存
JoshRen28 分钟前
springboot之集成Elasticsearch
spring boot·后端·elasticsearch
Elasticsearch32 分钟前
使用 OpenTelemetry 和 Elastic 的 ML 和 AI Ops 可观测性
elasticsearch
野犬寒鸦36 分钟前
MySQL复习记录Day01
数据库·后端
终端行者40 分钟前
记录一次ES索引迁移报错:1.两边索引参数不一致2.分析器与存储属性有冲突
elasticsearch
ward RINL41 分钟前
Spring boot启动原理及相关组件
数据库·spring boot·后端
RisunJan1 小时前
Linux命令-mysqldump(MySQL数据库中备份工具)
linux·数据库·mysql