Elasticsearch 实战应用详解!

Elasticsearch 实战应用详解

一、概述

Elasticsearch 是一个高度可扩展的开源全文搜索引擎,它能够处理大量数据并提供实时搜索和分析能力。基于 Lucene 构建,Elasticsearch 通过简单的 RESTful API 接口隐藏了 Lucene 的复杂性,使全文搜索变得更加容易。Elasticsearch 广泛应用于日志分析、全文检索、数据可视化等多个场景。

二、Elasticsearch 核心概念

在深入了解 Elasticsearch 的实战应用之前,我们需要了解一些核心概念:

  • 文档(Document):文档是 Elasticsearch 中的数据单位,类似于关系型数据库中的一行数据,每个文档都是一个 JSON 对象。
  • 索引(Index):索引是文档的集合,类似于关系型数据库中的数据库。索引中可以包含多个类型的文档。
  • 类型(Type):类型是对文档的一种分类,虽然在 Elasticsearch 7.x 版本中已被移除,但在早期版本中用于对不同文档进行区分。
  • 节点(Node):节点是集群中的一个运行实例,每个节点存储数据并参与索引和查询处理。
  • 集群(Cluster):集群是由多个节点组成的网络,共同提供数据存储和搜索服务。
三、实战应用案例
1. 电商平台商品搜索

业务场景:某电商平台需要为用户提供高效的商品搜索功能,要求在海量数据中快速返回匹配结果,并高亮显示关键字,提升用户体验。

解决方案

  • 索引设计:对商品名称、描述、品牌等字段进行全文索引,使用 Elasticsearch 的分词器(如 Standard Analyzer)处理数据,确保用户输入的关键字可以正确匹配商品信息。
  • 搜索功能:使用 match 查询类型,配合 multi_match 进行多个字段的搜索,确保用户查询能匹配到商品名称、描述等相关字段。
  • 高亮显示:使用 highlight 功能,在返回的结果中对匹配的关键字进行高亮处理,提升用户可读性。

示例代码

GET /products/_search
{"query": {"multi_match": {"query": "iPhone","fields": ["name", "description"]}},"highlight": {"fields": {"name": {},"description": {}}}
}
2. 日志实时分析

业务场景:企业需要对服务器日志进行实时分析,以便快速定位和解决问题。

解决方案

  • 日志收集:使用 Logstash 收集、聚合多台服务器上的日志信息,并将这些信息发送到 Elasticsearch 中存储。
  • 日志分析:使用 Kibana 提供友好的 web 界面来对收集到的日志信息进行分析,支持多种图表和仪表板。
  • 告警机制:设置告警规则,当特定条件触发时,通过邮件、短信等方式通知相关人员。

示例架构

应用日志 -> Logstash -> Elasticsearch -> Kibana
3. 用户行为分析

业务场景:电商平台需要分析用户的点击、浏览、购买等行为,以优化推荐系统和营销策略。

解决方案

  • 数据采集:通过埋点技术收集用户的每一步操作,将数据发送到 Kafka 消息队列。
  • 数据处理:使用 Spark Streaming 或 Flink 处理实时数据流,提取关键特征。
  • 数据存储:将处理后的数据存储到 Elasticsearch 中,支持快速查询和分析。
  • 数据分析:使用 Kibana 或自定义的 BI 工具进行用户行为分析,生成报告和可视化图表。

示例架构

用户行为 -> Kafka -> Spark Streaming/Flink -> Elasticsearch -> Kibana
4. 价格监控

业务场景:客户希望在商品价格低于某个阈值时收到通知。

解决方案

  • 数据存储:将商品的价格信息存储到 Elasticsearch 中。
  • 查询条件:将客户的查询条件存储到 Elasticsearch 索引中,使用 Percolator(反向搜索)功能匹配价格变动。
  • 通知机制:当价格变动符合条件时,触发通知机制,通过邮件、短信等方式通知客户。

示例代码

PUT /prices/_doc/1
{"product_id": "123","price": 100
}PUT /alerts/_percolate
{"query": {"match": {"product_id": "123"}},"document": {"product_id": "123","price": 90}
}
四、性能优化与最佳实践
  1. 合理配置集群参数:根据实际需求调整集群的节点数量、分片数量和副本数量,确保系统的高性能和高可用性。
  2. 使用缓存:利用 Elasticsearch 的缓存机制,减少重复查询的开销。
  3. 索引优化:合理设计索引映射,避免不必要的字段存储,提高索引效率。
  4. 数据生命周期管理:使用 ILM(Index Lifecycle Management)管理索引的生命周期,定期删除或归档旧数据,释放存储空间。
  5. 监控与告警:使用 Elasticsearch 的监控工具(如 X-Pack Monitoring)监控集群状态,设置告警规则,及时发现和解决问题。

合理的索引设计和查询优化是提高 Elasticsearch 性能的关键因素。Elasticsearch 的性能调优是一个复杂的过程,涉及多个方面,包括硬件配置、集群设置、索引设计、查询优化等。

下面详细介绍这三个方面的最佳实践和技巧。

合理的索引设计

1. 字段映射
  • 字段类型:选择合适的字段类型,避免不必要的数据存储和处理开销。例如,对于日期字段使用 date 类型,对于唯一标识符使用 keyword 类型。

    PUT /my-index
    {"mappings": {"properties": {"title": { "type": "text" },"date": { "type": "date" },"user_id": { "type": "keyword" }}}
    }
  • 禁用 _all 字段:从 Elasticsearch 7.0 开始,_all 字段已默认禁用。如果需要全局搜索功能,可以通过自定义字段实现。

    PUT /my-index
    {"mappings": {"properties": {"title": { "type": "text" },"content": { "type": "text" },"combined_field": {"type": "text","copy_to": "combined_field"}}}
    }
  • 动态映射:谨慎使用动态映射,避免意外的数据类型推断导致性能问题。可以通过设置 dynamic 参数来控制动态映射的行为。

    PUT /my-index
    {"mappings": {"dynamic": "strict","properties": {"title": { "type": "text" },"date": { "type": "date" }}}
    }
2. 分词器和分析器
  • 分词器:选择合适的分词器(Analyzer)来处理文本数据。常用的分词器包括 standardwhitespacestop 等。

    PUT /my-index
    {"settings": {"analysis": {"analyzer": {"my_analyzer": {"type": "custom","tokenizer": "standard","filter": ["lowercase", "stop"]}}}},"mappings": {"properties": {"title": { "type": "text", "analyzer": "my_analyzer" }}}
    }
  • 多字段映射:对于需要不同方式处理的字段,可以使用多字段映射(Multi-fields)。

    PUT /my-index
    {"mappings": {"properties": {"title": {"type": "text","fields": {"raw": { "type": "keyword" }}}}}
    }
3. 索引模板
  • 索引模板:使用索引模板管理多个索引的映射和设置,确保一致性。
    PUT _template/my-template
    {"index_patterns": ["logs-*"],"settings": {"number_of_shards": 1,"number_of_replicas": 1},"mappings": {"properties": {"timestamp": { "type": "date" },"message": { "type": "text" }}}
    }
4. 索引生命周期管理
  • ILM(Index Lifecycle Management):使用 ILM 管理索引的生命周期,自动进行索引滚动、合并和删除等操作。
    PUT _ilm/policy/my-policy
    {"policy": {"phases": {"hot": {"min_age": "0ms","actions": {"rollover": {"max_size": "50gb","max_age": "30d"}}},"delete": {"min_age": "90d","actions": {"delete": {}}}}}
    }

查询优化

1. 使用过滤器
  • 过滤器 vs 查询:过滤器(Filter)比查询(Query)更快,因为它不需要评分(Scoring)。在布尔查询(Boolean Query)中,尽量使用 filter 子句。
    GET /my-index/_search
    {"query": {"bool": {"must": [{ "match": { "title": "Elasticsearch" }}],"filter": [{ "term": { "status": "published" }}]}}
    }
2. 分页查询
  • 深度分页问题:对于大数据量的分页查询,使用 search_after 参数代替 from 和 size,避免深度分页问题。
    GET /my-index/_search
    {"size": 10,"sort": [{ "timestamp": "desc" }],"search_after": [1580722032000]
    }
3. 缓存
  • 查询缓存:利用 Elasticsearch 的查询缓存和结果缓存,减少重复查询的开销。
    GET /my-index/_search
    {"query": {"bool": {"must": [{ "match": { "title": "Elasticsearch" }}],"filter": [{ "term": { "status": "published" }}]}},"_source": false,"stored_fields": ["id"]
    }
4. 字段选择
  • 减少返回字段:使用 _source 和 stored_fields 参数减少返回的字段数量,降低网络传输和处理开销。
    GET /my-index/_search
    {"_source": ["title", "date"],"query": {"match": { "title": "Elasticsearch" }}
    }
5. 聚合查询优化
  • 子聚合:合理使用子聚合(Sub-aggregations),避免过多的嵌套聚合。

    GET /my-index/_search
    {"size": 0,"aggs": {"by_status": {"terms": { "field": "status" },"aggs": {"by_user": {"terms": { "field": "user_id" }}}}}
    }
  • 采样:对于大数据量的聚合查询,可以使用采样(Sampling)来减少计算量。

    GET /my-index/_search
    {"size": 0,"aggs": {"sample": {"sampler": { "shard_size": 1000 },"aggs": {"by_status": {"terms": { "field": "status" }}}}}
    }

性能调优

1. 硬件配置
  • 内存:Elasticsearch 需要足够的内存来处理索引和查询操作。建议分配足够大的堆内存(Heap Memory),通常建议设置为总内存的 50% 左右,最大不超过 32GB。超过 32GB 会导致 JVM 的压缩指针问题,影响性能。

    export ES_JAVA_OPTS="-Xms8g -Xmx8g"
  • 磁盘:使用 SSD 盘可以显著提高 I/O 性能,特别是在写入密集型场景中。

  • CPU:确保有足够的 CPU 核心数,特别是对于计算密集型的操作,如复杂的聚合查询。

2. 集群设置
  • 节点角色:合理分配节点角色,例如:

    • Data Nodes:负责存储数据和执行搜索操作。
    • Master Nodes:负责集群管理和协调工作。
    • Ingest Nodes:负责数据预处理,如解析日志。
    • Client Nodes:作为协调节点,转发请求到其他节点。
  • 分片和副本:合理设置分片(Shards)和副本(Replicas)的数量:

    • 分片:根据数据量和查询负载设置合适的分片数。过多的分片会增加管理开销,过少的分片会影响并发性能。
    • 副本:副本可以提高查询性能和数据冗余。通常建议至少有一个副本,以确保高可用性。
  • 路由:使用路由(Routing)参数将相关数据分配到同一个分片中,减少跨分片查询的开销。

    PUT /my-index
    {"settings": {"number_of_shards": 3,"number_of_replicas": 1,"index.routing.allocation.require.tag": "hot"}
    }
3. 索引设计
  • 映射类型:合理设置字段的映射类型,避免不必要的字段存储。例如,对于不需要全文搜索的字段,可以设置为 not_analyzed

    PUT /my-index
    {"mappings": {"properties": {"title": { "type": "text" },"date": { "type": "date" },"user_id": { "type": "keyword" }}}
    }
  • 索引模板:使用索引模板(Index Templates)管理多个索引的映射和设置,确保一致性。

    PUT _template/my-template
    {"index_patterns": ["logs-*"],"settings": {"number_of_shards": 1},"mappings": {"properties": {"timestamp": { "type": "date" },"message": { "type": "text" }}}
    }
  • 索引生命周期管理:使用 ILM(Index Lifecycle Management)管理索引的生命周期,自动进行索引滚动、合并和删除等操作。

    PUT _ilm/policy/my-policy
    {"policy": {"phases": {"hot": {"min_age": "0ms","actions": {"rollover": {"max_size": "50gb","max_age": "30d"}}},"delete": {"min_age": "90d","actions": {"delete": {}}}}}
    }
4. 查询优化
  • 使用过滤器:过滤器(Filter)比查询(Query)更快,因为它不需要评分(Scoring)。在布尔查询(Boolean Query)中,尽量使用 filter 子句。

    GET /my-index/_search
    {"query": {"bool": {"must": [{ "match": { "title": "Elasticsearch" }}],"filter": [{ "term": { "status": "published" }}]}}
    }
  • 分页查询:对于大数据量的分页查询,使用 search_after 参数代替 fromsize,避免深度分页问题。

    GET /my-index/_search
    {"size": 10,"sort": [{ "timestamp": "desc" }],"search_after": [1580722032000]
    }
  • 缓存:利用 Elasticsearch 的查询缓存和结果缓存,减少重复查询的开销。

    GET /my-index/_search
    {"query": {"bool": {"must": [{ "match": { "title": "Elasticsearch" }}],"filter": [{ "term": { "status": "published" }}]}},"_source": false,"stored_fields": ["id"]
    }
5. 监控与调优
  • 监控工具:使用 Elasticsearch 的内置监控工具(如 X-Pack Monitoring)或第三方工具(如 Prometheus 和 Grafana)监控集群状态,包括节点健康、索引状态、查询性能等。

    GET _cluster/health
    GET _nodes/stats
    GET _cat/indices?v
  • 慢查询日志:启用慢查询日志(Slow Log),记录执行时间较长的查询,帮助识别和优化性能瓶颈。

    PUT /my-index/_settings
    {"index.search.slowlog.threshold.query.warn": "10s","index.search.slowlog.threshold.query.info": "5s","index.search.slowlog.threshold.query.debug": "2s","index.search.slowlog.threshold.query.trace": "500ms"
    }
  • 定期维护:定期进行索引合并(Force Merge)、段优化(Segment Optimization)等操作,保持索引的高效性。

    POST /my-index/_forcemerge?max_num_segments=5
6. 安全性和权限管理
  • 安全设置:启用 X-Pack Security 或其他安全插件,设置用户权限和访问控制,保护集群免受未授权访问。
    PUT /_security/user/admin
    {"password" : "mysecretpassword","roles" : [ "superuser" ]
    }
五、总结

Elasticsearch 是一个功能强大的分布式搜索引擎,广泛应用于多种业务场景通过合理的索引设计、查询优化和性能调优,可以充分发挥 Elasticsearch 的优势,满足不同业务需求。希望以上实战应用案例和最佳实践能为你提供有价值的参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/2586.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

安全合规:沃尔玛自养号测评技术搭建要点

沃尔玛自养号测评技术的搭建是一个复杂且需综合考量多方面因素的过程,以下是对其技术搭建的详细解析: 一、硬件与网络环境搭建 硬件参数伪装: 利用国外服务器在云端搭建安全终端,全面阻断沃尔玛平台对设备底层硬件参数的检测&a…

Ps:天空替换

Ps菜单:编辑/天空替换 Edit/Sky Replacement Ps菜单:选择/天空 Select/Sky 天空替换 Sky Replacement命令能够自动分析前景与天空,利用 Adobe Sensei 技术也大大减轻了制作蒙版的负担,可以直观、智能、快速地实现天空替换。 到目…

【JavaEE初阶】网络编程TCP协议实现回显服务器以及如何处理多个客户端的响应

前言 🌟🌟本期讲解关于TCP/UDP协议的原理理解~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么废话不多说…

MySQL 9从入门到性能优化-加密函数

【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

探索空间计算与 VR 设备的未来:4K4DGen 高分辨率全景 4D 内容生成系统

在当今科技飞速发展的时代,空间计算和 VR 设备正逐渐成为人们体验沉浸式场景的重要工具。而今天,我们要为大家介绍一款具有创新性的技术 ——4K4DGen 高分辨率全景 4D 内容生成系统,它为 VR/AR 沉浸式体验带来了全新的可能性。 一、项目概述 4K4DGen 项目的核心目标是实现 …

Unity中实现伤害飘字或者提示飘字效果(DoTween实现版本)

!!!在实现以下效果之前,一定要往项目中导入DoTween插件。 一、搭建测试场景 1、在场景中新建一个带有Text组件的游戏物体A,并把这个游戏物体A中Text组件的Color属性中alpha值为0,让文字在场景中隐藏。 …

为什么说模拟电路的难点就在开通过程和关断过程?难在什么地方?

模拟电路中开通过程和关断过程之所以困难,主要有以下几个方面的原因: 1. 瞬态响应特性复杂 - 在开通和关断瞬间,电路中的电流和电压会发生快速变化,产生复杂的瞬态响应。这些瞬态响应可能包含过冲、下冲、振铃等现象,…

数据结构---二叉树(顺序结构),堆(上)

树 树的概念与结构 树是⼀种⾮线性的数据结构,它是由 n(n>=0) 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。 PS 有⼀个特殊的结点,称为根结点,根结点没有前驱结点。除根结点外,其余结点被分成…

CSS中常见的两列布局、三列布局、百分比和多行多列布局!

目录 一、两列布局 1、前言: 2. 两列布局的常见用法 两列布局的元素示例: 代码运行后如下: 二、三列布局 1.前言 2. 三列布局的常见用法 三列布局的元素示例: 代码运行后如下: 三、多行多列 1.前言 2&…

发现了NitroShare的一个bug

NitroShare 是一个跨平台的局域网开源网络文件传输应用程序,它利用广播发现机制在本地网络中找到其他安装了 NitroShare 的设备,从而实现这些设备之间的文件和文件夹发送。 NitroShare 支持 Windows、macOS 和 Linux 操作系统。 NitroShare允许我们为…

新世联科技:NG2-A-7在DAC空气捕集提取CO2的应用

一、DAC空气捕集提取CO2的介绍 直接空气碳捕获(Direct Air Capture,简称DAC)是一种直接从大气中提取二氧化碳的技术。 二、DAC空气捕集提取CO2的前景 从大气中提取的这种二氧化碳可以作为循环经济的一部分以各种不同方式使用。未来&#xf…

ABAP开发学习——OLE常用方法和属性

ABAP开发学习——OLE-CSDN博客 OLE常用方法和属性

如何学习Java“高并发”,并在项目中实际应用?

高并发编程 提到并发编程很多人就会头疼了;首先就是一些基础概念:并发,并行,同步,异步,临界区,阻塞,非阻塞还有各种锁全都砸你脸上,随之而来的就是要保证程序运行时关键…

Echarts使用柱状图实现横向数据展示,实现为每个柱子设置不同的颜色

这里使用echarts柱状图实现横向数据展示,同时给每个柱子设置不同的颜色,给柱子设置背景颜色等 话不多说直接上图吧 这里直接贴上代码: option {backgroundColor: "#1C162E", //背景颜色tooltip: {show: false},legend: {show: …

JavaScript重定向对网络爬虫的影响及处理

在网络爬虫的开发和应用中,JavaScript重定向是一个不可忽视的技术挑战。它不仅增加了爬取数据的复杂性,还可能影响爬虫的效率和准确性。本文将探讨JavaScript重定向对网络爬虫的影响,并提供处理这些重定向的高级技巧。 理解JavaScript重定向…

动态与静态网站抓取的区别:从抓取策略到性能优化

引言 随着互联网数据的迅速增长,网页抓取技术在数据采集和信息获取中扮演着越来越重要的角色。不同类型的网站在实现方式和数据获取策略上存在显著差异。特别是动态网站和静态网站,由于页面生成方式不同,采用的爬虫技术也有所不同。本文将详…

架构师:构建高效团队和解决技术问题的指南

1、简述 在技术管理领域,管理者不仅要深入理解技术,还要关注团队成员的成长、有效的项目推进以及高效的决策和问题解决能力。技术管理者在技术与管理的平衡中,需要能够清晰理解技术背景,制定合理的策略,促进团队合作,迅速应对问题。 本文将探讨作为技术管理者的常见挑战…

浅谈vuex和pinia的区别

文章目录 介绍核心概念用法区别导入stategettersMutationsActions 工作原理优缺点 本篇文章主要展示vuex和pinia的区别,详情使用请看博主其他文章或者官方文档 vuex官网:https://vuex.vuejs.org/zh/guide/ pinia官网:https://pinia.vuejs.org…

python的json库的基本应用

总目录 一、json库的介绍 Python 的 json 库是一个非常常用的库,用于处理 JSON 数据。以下是 json 库的基本功能: 编码(将 Python 对象转换为 JSON 字符串) 解码(将 JSON 字符串转换为 Python 对象) 读写文…

R language 关于二维平面直角坐标系的制作

昨天说参与了机器学习的学习,今天又来讲讲这一天的学习,主要是做简单的数据分析和展示、 首先,基于系能源汽车的流行,做了一组图,如下: DATASET: 1.比亚迪海鸥,磷酸铁锂,…