当前位置: 首页 > news >正文

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 的优势,满足不同业务需求。希望以上实战应用案例和最佳实践能为你提供有价值的参考。

相关文章:

Elasticsearch 实战应用详解!

Elasticsearch 实战应用详解 一、概述 Elasticsearch 是一个高度可扩展的开源全文搜索引擎,它能够处理大量数据并提供实时搜索和分析能力。基于 Lucene 构建,Elasticsearch 通过简单的 RESTful API 接口隐藏了 Lucene 的复杂性,使全文搜索变…...

最新最全面的JAVA面试题免费下载

面对求职市场的激烈竞争,掌握全面且深入的Java知识已成为每一位Java开发者必不可少的技能。《2023最新版Java面试八股文》是一份精心整理的面试准备资料,旨在帮助广大开发者系统复习,从容应对Java及相关技术栈的面试挑战。这份文档不仅汇聚了…...

修改sql server 数据库的排序规则

文章目录 引言I 解决方案案例II 知识扩展排序规则SQL SERVER支持的所有排序规则引言 新增sql server 数据库实例的默认排序规则不支持中文存储,导致乱码 解决方案: 修改排序规则为Chinese_PRC_CI_AS 或者 Chinese_PRC_Stroke_CI_AS_WS或者Chinese_PRC_CI_AI_KS_WS 仅对新增…...

Node学习记录-until实用工具

来源:Nodejs 第十八章(util) util 是Node.js内部提供的很多实用或者工具类型的API util.promisify 用于将遵循Node回调风格(即最后一个参数为回调函数)的函数转换成返回Promise的函数,这样可以使得异步代…...

【Mac】安装 VMware Fusion Pro

VMware Fusion Pro 软件已经正式免费提供给个人用户使用! 1、下载 【官网】 下拉找到 VMware Fusion Pro Download 登陆账号 如果没有账号,点击右上角 LOGIN ,选择 REGISTER 注册信息除了邮箱外可随意填写 登陆时,Username为…...

解决go run main.go executable file not found in %PATH%

项目场景: 命令行执行go run 都会报 executable file not found in %PATH% 问题描述 最近我发现,我通过命令行,无论是跑什么go文件,都会出现这个错误。但是我通过我的IDE就能跑,于是我也没有管它。 但是最近&#x…...

C++ 手写常见的任务定时器

序言 最近在编写 C 的服务器代码时,我遇到了一个需求,服务器很可能会遇到那些长期不活跃的连接,这些连接占用了一定的资源但是并没有进行有效的通信。为了优化资源使用,我决定实现一个定时器,以便定期检查连接的活跃状…...

【VS+QT】联合开发踩坑记录

最新更新日期:2024/11/05 0. 写在前面 因为目前在做自动化产线集成软件开发相关的工作,需要用到QT,所以选择了VS联合开发,方便调试。学习QT的过程中也踩了很多坑,在此记录一下,提供给各位参考。 1. 环境配…...

PH热榜 | 2024-11-05

DevNow 是一个精简的开源技术博客项目模版,支持 Vercel 一键部署,支持评论、搜索等功能,欢迎大家体验。 Github:https://github.com/LaughingZhu/DevNow 1. FullContext 标语:用自然语言,让你的市场推广流…...

模拟机器人逐字回答,类似于实时回话

代码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head><…...

Java学习路线:JUL日志系统(一)日志框架介绍

目录 打印日志 日志的级别 打印文件 日志过滤器 日志输出流程 首先&#xff0c;为什么要使用日志系统&#xff1f; 如果单纯地用System.out.println打印信息&#xff0c;如果项目比较大&#xff0c;存在大量的信息就会显得非常凌乱。 而且&#xff0c;当我们希望在debug的…...

[渲染层网络层错误] net::ERR_CONTENT_LENGTH_MISMATCH 问题解决

问题描述 问题背景 微信小程序访问后端img资源的时候&#xff0c;偶尔出现这个感叹号&#xff0c;图片加载不出来&#xff0c;但是对应的url贴出来在浏览器中访问&#xff0c;或者重新加载是可以访问的。 错误描述 经查询前端报错 [渲染层网络层错误] net::ERR_CONTENT_LE…...

C 语言编程中的常见错误及解决方案

在 C 语言开发中&#xff0c;编译和链接错误是常见的问题&#xff0c;尤其是在处理多个源文件时。本文将总结一些常见的错误&#xff0c;并提供相应的解决方案&#xff0c;以帮助开发者更高效地排查和修复这些问题。 1. 结构体作用域问题 问题描述 在函数参数列表中定义结构体…...

开源模型应用落地-glm模型小试-glm-4-9b-chat-批量推理(二)

一、前言 GLM-4是智谱AI团队于2024年1月16日发布的基座大模型&#xff0c;旨在自动理解和规划用户的复杂指令&#xff0c;并能调用网页浏览器。其功能包括数据分析、图表创建、PPT生成等&#xff0c;支持128K的上下文窗口&#xff0c;使其在长文本处理和精度召回方面表现优异&a…...

【C++篇】数据之林:解读二叉搜索树的优雅结构与运算哲学

文章目录 二叉搜索树详解&#xff1a;基础与基本操作前言第一章&#xff1a;二叉搜索树的概念1.1 二叉搜索树的定义1.1.1 为什么使用二叉搜索树&#xff1f; 第二章&#xff1a;二叉搜索树的性能分析2.1 最佳与最差情况2.1.1 最佳情况2.1.2 最差情况 2.2 平衡树的优势 第三章&a…...

C#-类:声明类、声明类对象

一&#xff1a;类的声明 class 类名 {//特征——成员变量//行为——成员方法//保护特征——成员属性//构造函数和析构函数//索引器//运算符重载//静态成员 }类名&#xff1a;帕斯卡 同一个语句块中的不同类 不能重名 二&#xff1a;声明类对象 2.1 类的声明 ≠ 类对象的声…...

【AIGC】ChatGPT提示词Prompt高效编写技巧:逆向拆解OpenAI官方提示词

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;OpenAI官方提示词的介绍OpenAI官方提示词的结构与组成如何通过分析提示词找到其核心组件 &#x1f4af;OpenAI官方提示词分析案例一&#xff1a;制定教学计划案例二&…...

【linux】端口监听和终止进程

端口监听和终止进程 有时候&#xff0c;即使进程看起来已经关闭&#xff0c;它可能仍然占用着端口。你可以使用 netstat -tulpn | grep <端口号> 来查看哪个进程正在使用该端口&#xff0c;然后使用 kill -9 来强制关闭该进程。 [naienotebook-npu-b1bb152e-7655cb9d4…...

【网络安全】|kali中安装nessus

1、使用 df -h 命令查看磁盘使用情况&#xff0c;确保磁盘容量大于40G 简单粗暴办法&#xff1a;重装系统&#xff0c;装系统中注意磁盘空间相关的选项 //磁盘扩容&#xff1a;https://wiki.bafangwy.com/doc/670/ 2、安装 nessus 安装教程 https://blog.csdn.net/Cairo_A/a…...

Docker可视化管理面板DPanel的安装

本文软件由网友 rui 推荐&#xff1b; 什么是 DPanel &#xff1f; DPanel 是一款 Docker 可视化管理面板&#xff0c;旨在简化 Docker 容器、镜像和文件的管理。它提供了一系列功能&#xff0c;使用户能够更轻松地管理和部署 Docker 环境。 软件特点&#xff1a; 可视化管理&…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

Java数组Arrays操作全攻略

Arrays类的概述 Java中的Arrays类位于java.util包中&#xff0c;提供了一系列静态方法用于操作数组&#xff08;如排序、搜索、填充、比较等&#xff09;。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序&#xff08;sort&#xff09; 对数组进行升序…...

ArcGIS Pro+ArcGIS给你的地图加上北回归线!

今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等&#xff0c;设置经线、纬线都以10间隔显示。 2、需要插入背会归线&#xf…...