秋招Java后端开发冲刺——非关系型数据库篇(Elasticsearch)

发布于:2024-06-26 ⋅ 阅读:(46) ⋅ 点赞:(0)

Elasticsearch

本文对非关系型数据库Elasticsearch的基础知识及常见面试问题进行介绍。

(一)基础知识

1. Elasticsearch 是一个基于 Apache Lucene 的分布式、高扩展、高实时的搜索与数据分析引擎适用于各种数据类型,包括文本、数值、日期等。
2. 核心组件

  • Kibana:可视化工具,用于展示和分析数据
  • Logstash:数据收集和处理管道工具
  • Beats:轻量级数据采集器,用于将数据发送到 Elasticsearch

3. 特点

特点 描述
全文搜索 提供强大的全文搜索功能,包括复杂查询、排名和相关性评分。
分布式架构 设计为分布式架构,可以通过增加节点来水平扩展集群。
实时索引和搜索 允许近乎实时的索引和搜索,确保数据能够快速更新和检索。
多种数据类型支持 支持结构化和非结构化数据,包括文本、数字、日期、地理位置等。
强大的分析能力 通过聚合功能,对大数据集进行复杂的分析和统计。
高可用性 通过分片和副本机制,提供数据的高可用性和故障恢复能力。
水平可扩展性 可以通过添加节点来轻松扩展集群容量,支持处理大规模数据。
RESTful API 提供基于 HTTP 的 RESTful API,方便与各种应用集成。
生态系统丰富 与 Kibana、Logstash 和 Beats 等工具无缝集成,形成一个完整的数据解决方案。
自动分片和复制 自动管理分片和副本分配,简化运维工作。
安全性 提供细粒度的访问控制、安全通信和审计功能(通过 X-Pack 等插件)。
多语言支持 支持多种语言的文本分析和搜索,包括中文、英文、法文等。

4.存储结构

  • JSON 文档:文档是 Elasticsearch 中的最小数据单元(类似于数据库中的行),以 JSON 格式存储。每个文档都有一个唯一的标识符(ID)和一个所属的索引
  • 倒排索引:是搜索引擎的核心数据结构,用于快速查找包含某个词项的所有文档。它由词典(Term Dictionary)和词项列表(Postings List)组成
    ① 词典:存储所有的词项
    ② 词项列表:包含每个词项在文档中的位置和频率信息
  • 存储字段(Stored Fields):存储每个文档的原始 JSON 数据
  • 文档值(Doc Values):存储数值型、日期型和地理位置等字段,优化这些字段的检索效率,用于排序和聚合操作的专用存储结构,独立于倒排索引

5. 集群
(1)一个 Elasticsearch 集群由一个或多个节点组成,这些节点共同工作以存储数据和提供搜索功能。集群有一个唯一的名字,通过这个名字可以识别和加入集群。
(2)组成

  • 主节点(Master Node):负责管理集群的元数据(例如索引和分片的分配)
  • 数据节点(Data Node):存储数据并处理搜索和聚合请求
  • 协调节点(Coordinating Node):处理客户端请求,分发到适当的数据节点,不存储数据
  • 专用节点:如专用主节点、专用数据节点、专用协调节点和专用机器学习节点

6.分片和副本
(1)分片是 Elasticsearch 中用于水平拆分索引数据的基本单位。每个分片本质上是一个独立的 Lucene 索引,可以存储在不同的节点上。
(2)分类

  • 主分片(Primary Shard):索引的主要分片,所有文档首先写入主分片
  • 副本分片(Replica Shard):主分片的复制品,用于提供故障恢复和负载均衡

(3)分片创建:在创建索引时,可以指定主分片和副本分片的数量。

在这里插入代码片PUT /my_index
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  }
}

:主分片的数量在创建索引后不能更改,而副本分片的数量可以在任何时候调整

(4)分片分配

  • Elasticsearch 会自动将分片分配到集群中的不同节点,以实现数据的均匀分布和高可用性
  • 在节点故障或新节点加入时,分片会被重新分配以保持集群的平衡

(5)分配策略

  • 轮询分配:分片轮流分配到不同节点,以均衡负载
  • 故障恢复:在节点故障时,主节点会将受影响的分片重新分配到其他节点
  • 数据重定位:在新节点加入时,主节点会重新分配分片以利用新节点的存储和计算资源
(二)常见问题

1. Elasticsearch的主要应用
(1)全文搜索
Elasticsearch 最常见的应用之一是全文搜索。它可以在大量文本数据中快速找到相关文档,支持复杂查询和排序。

  • 网站搜索:为网站提供内部搜索功能,用户可以通过关键词快速找到所需信息
  • 文档管理:在文档库中进行全文搜索,方便用户查找特定内容

(2)日志和事件数据分析
Elasticsearch 可以处理和分析大量日志和事件数据,帮助企业进行实时监控和故障排除。

  • 日志管理和分析:与 Logstash 和 Kibana 集成,构建 ELK(Elasticsearch, Logstash, Kibana)栈,用于收集、分析和可视化日志数据
  • 安全信息和事件管理(SIEM):用于实时监控和分析安全事件,快速检测和响应安全威胁

(3)应用程序性能监控(APM)
通过收集和分析应用程序的性能数据,Elasticsearch 帮助开发和运维团队监控应用程序性能,识别瓶颈并优化性能。

  • APM 解决方案:如 Elastic APM,提供端到端的性能监控和分析,包括请求追踪、错误报告和性能指标

(4)数据分析和可视化
Elasticsearch 强大的聚合功能使其成为大数据分析和可视化的理想工具。

  • 业务智能(BI):进行复杂的数据分析和统计,生成商业报告和洞察
  • 实时分析:实时处理和分析流数据,支持快速决策和响应

(5)电商搜索和推荐系统
Elasticsearch 被广泛应用于电子商务平台,提供强大的搜索和推荐功能,提升用户体验和转化率。

  • 产品搜索:快速响应用户查询,提供相关产品的搜索结果。
  • 个性化推荐:基于用户行为和历史数据,提供个性化的产品推荐。

(6)地理空间搜索
Elasticsearch 支持地理空间数据,可以进行地理位置相关的搜索和分析。

  • 地图和位置服务:在地图应用中查找附近的地点或设施
  • 地理围栏:基于地理位置触发特定事件或通知

(7)社交媒体分析
通过分析社交媒体数据,帮助企业了解用户行为和市场趋势。

  • 情感分析:分析用户对产品或服务的评论和反馈,了解用户情感倾向
  • 话题趋势分析:识别和分析热门话题,帮助制定营销策略

(8)金融数据分析
在金融行业,Elasticsearch 用于分析交易数据、市场数据和风险管理。

  • 交易监控:实时监控和分析交易数据,识别异常交易行为。
  • 市场趋势分析:分析市场数据,预测市场趋势和价格波动。

2. Elasticsearch 数据的备份与恢复
(1)Elasticsearch 提供了快照和恢复(Snapshot and Restore)功能,用于备份索引数据到一个远程存储库,并在需要时从这些快照中恢复数据。
(2)快照是某一时刻的
索引数据
完整副本
(3)恢复快照时,可以选择恢复全部索引或特定索引,并指定目标索引名称。
(4)快照管理

  • 定期备份:定期创建快照以确保数据的持续保护
  • 监控快照状态:使用 Elasticsearch 的监控工具或 API 监控快照创建和恢复的状态
  • 存储库管理:定期清理和管理快照存储库,删除不再需要的快照

3. Elasticsearch 的查询 DSL(Domain Specific Language)
(1)查询 DSL(Domain Specific Language)是一种功能强大的 JSON 风格的查询语言,允许用户构建复杂的搜索请求。
(2)基本结构

  • 查询上下文:用于计算文档的相关性评分,适用于全文搜索
  • 过滤器上下文:用于筛选文档,判断文档是否匹配条件,不计算相关性评分
    (3)查询类型
  • Match Query:用于全文搜索,查找与查询文本匹配的文档
  • Term Query:用于精确匹配,查找字段中包含确切值的文档
  • Range Query:用于查找字段值在指定范围内的文档
  • Bool Query:用于组合多个查询,包含 must(必须匹配)、should(应匹配)、must_not(必须不匹配)和 filter(过滤)子句
  • Phrase Match Query:用于查找包含确切短语的文档
  • Wildcard Query:用于查找与通配符模式匹配的文档
  • Term Filter:用于筛选字段中包含确切值的文档
  • Range Filter:用于筛选字段值在指定范围内的文档
  • Exists Filter:用于筛选字段存在的文档

4. 如何处理 Elasticsearch 中的慢查询

  • 慢查询日志:Elasticsearch 提供了慢查询日志,可以用来记录执行时间超过阈值的查询。其 Elasticsearch 可以分别为索引和搜索操作设置慢查询日志。
  • Profiling API:Elasticsearch 提供了 Profile API,可以详细分析查询的执行步骤和时间

5. Elasticsearch 优化查询

  • 避免使用复杂和嵌套查询:简化查询结构,减少不必要的嵌套查询
  • 使用过滤器:在 bool 查询中,使用 filter 而不是 must,因为过滤器不计算相关性评分,性能更高
  • 字段映射优化:为常用搜索字段设置合适的类型和分析器,避免非必要的全文搜索
  • 使用多字段(Multi-Fields):在一个字段上应用多种分析方式
  • 深分页(Deep Pagination):避免深度分页,因为它会导致大量数据传输。使用 search_after 或 scroll 进行深分页查询

网站公告

今日签到

点亮在社区的每一天
去签到