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

ElasticSearch快速入门--实现分词搜索

分词题目搜索

使用Elasticsearch实现题目数据的存储和分词搜索,需要将数据库的数据同步到 Elasticsearch。

ElasticSearch入门

ElasticSearch(简称ES)是一个开源的分布式搜索和数据分析引擎,用Java开发并且是当前最流行的开源的企业级搜索引擎,能够达到近实时搜索,它专门设计用于处理大规模的文本数据和实现高性能的全文检索。

  • 官方文档:https://www.elastic.co/docs
  • 下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch

搜索引擎的排名

在这里插入图片描述

参考网站:https://db-engines.com/en/ranking/search+engine

生态介绍
  • ElasticSearch

核心全文搜索与分析引擎。利用分布式架构提供近乎实时的数据搜索、分析和可视化能力。负责存储、索引和搜索数据。

  • Logstash

服务器端数据处理管道,能够同时从多个源采集数据转换数据,并过滤、增强和传输到Elasticsearch。支持丰富的输入、过滤和输出插件。

  • Beats

轻量级的数据采集工具,每个Beat都是一个独立的守护进程,负责从系统或应用程序中收集数据,发送数据到LogstashElasticsearch

包括Filebeat: 收集日志文件。Metricbeat: 收集系统和服务的指标。Packetbeat: 监控网络流量。

  • Kibana

可视化和管理界面,为Elasticsearch数据提供可视化功能。用户可以轻松创建仪表板、图表和地图,直观展示和查询Elasticsearch中的数据

应用场景

只要用到搜索的场景,Elasticsearch几乎都可以是最好的选择。结合Kibana、Logstash、Beats,ElaticSearch可以用于全文检索、日志分析、商业智能场景。

全文检索

首先,Elasticsearch支持各类应用、网站等的全文搜索,包括淘宝、京东等电商平台的搜索

其次,它支持用户通过自定义打分、自定义排序、高亮等机制召回期望的结果数据,通过跨机房/跨机架感知、异地容灾等策略,为用户提供高可用、高并发、低延时、用户体验好的搜索服务。

许多知名企业,如阿里巴巴、腾讯、携程、滴滴出行、美团、字节跳动、贝壳找房等,都将Elasticsearch作为关键技术之一

日志分析

许多知名企业,如58集团、唯品会、日志易、国投瑞银等,都使用Elasticsearch来快速分析和处理大量的日志数据,从而对业务运行状况进行实时的监控和故障排查。

商业智能场景

大型业务数据给电子商务、移动App开发、广告媒体等领域的企业的数据收集和数据分析带来了巨大的挑战。而Elasticsearch具有结构化查询功能,能实现全文数据检索和聚合分析

核心概念
常用术语

对比MySQL来理解Elasticsearch,我们可以更直观地看出Elasticsearch与传统数据库之间的关系及差异。

在这里插入图片描述

索引
  • 索引是Elasticsearch中用于存储和管理相关数据的逻辑容器。相当于数据库中的一个表,它包含了多条具有相似结构的文档
  • 索引的名称可以由用户自定义,但必须全部小写。
//创建索引并设置别名
PUT /my_index
{"aliases": {"alias_name": {}  // 创建一个别名 alias_name,指向 my_index}
}
//创建索引的同时设置 settings 和 mappings
PUT /my_index
{"settings": {...},"mappings": {...}	
}
文档

索引中的每条记录,类似于数据库中的行。以JSON格式的文档存储在索引内。每个索引具有唯一的名称,以便在执行搜索、更新和删除操作时进行引用。键是字段的名称,值是不同数据类型的字段。不同的数据类型包含但不限于字符串类型、数字类型、布尔类型、对象类型等。

{"_index": "employee","_id": "2","_version": 1,"_seq_no": 1,"_primary_term": 1,"found": true,     //示查询时是否找到了对应的文档"_source": {      //文档原始json数据类型"name": "李四","sex": 1,"age": 28,"address": "广州荔湾大厦","remark": "java assistant"}
}

在这里插入图片描述

映射

类似关系型数据库中的Schema表结构。帮助控制字段的存储、索引和查询行为。用于定义索引中文档字段的数据类型及其处理方式

映射的定义如下所示:

PUT /employee
{"mappings": {"properties": {"name": {"type": "keyword"},"sex": {"type": "integer"},"age": {"type": "integer"},"address": {"type": "text","analyzer": "ik_max_word"},"remark": {"type": "text","analyzer": "ik_smart"}}}
}

扩展

集群:多个节点组成的群集,用于存储数据并提供搜索功能。。集群中的每个节点都可以处理数据。

分片(Shard): 为了实现横向扩展,ES 将索引拆分成多个分片,每个分片可以分布在不同节点上。

副本(Replica):分片的复制品,用于提高可用性和容错性。

全文检索

全文检索(Full-Text Search)是一种从大量文本数据中快速检索出包含指定词汇或短语的技术。允许用户输入一个或多个关键词,然后系统会在预先建立好的索引中查找包含这些关键词的文档或文档片段,并返回给用户。

在这里插入图片描述

设想一个关于全文检索的场景,比如搜索Java设计模式:

思考:用传统关系型数据库实现有什么问题?

如果是用MySQL存储文章 ,我们应该会使用这样的 SQL 去查询

select * from t_blog where content like "%Java设计模式%"
#这种需要遍历所有的记录进行匹配,不但效率低,而且搜索结果不符合我们搜索时的期望。
实现原理

1)分词: Elasticsearch的分词器会将输入文本拆解成独立的词条(tokens)方便进行索引和搜索。分词的具体过程包括以下几步:

  • 字符过滤: 去除特殊字符、HTML 标签或进行其他文本清理。
  • 分词: 根据指定的分词器(analyzer),将文本按规则拆分成一个个词条。例如,英文可以按空格拆分,中文使用专门的分词器处理。
  • 词汇过滤: 对分词结果进行过滤,如去掉常见但无意义的词,如"the"、"s"等)或进行词形归并( 如将动词变为原形 )。

Elasticsearch 内置了很多分词器,比如按照空格分词等,默认只支持英文,可以在官方文档了解。

2)对处理后的文本数据建立倒排索引,将单词映射到包含该单词的文档列表中,以便快速定位相关文档。

倒排索引

倒排索引的建立过程是先对文档进行分词处理,然后记录每个单词在哪些文档中出现,以及出现的位置信息。可以根据关键词或短语快速找到包含这些词语的文档, 比如创建文章的时候,中文分词后生成的倒排索引如下两列:

关键词文章ID是否命中索引
Java1,2
设计模式1,2,3,4
多线程2
JavaScript4

倒排索引的实现涉及到多个步骤

1)文档预处理:对文档进行分词处理,移除停用词,并进行词干提取等操作。

2)构建词典:将处理后的词汇添加到词典中,并为每个词汇分配一个唯一的ID。

3)创建倒排列表:对于词典中的每个词汇,创建一个倒排列表,记录该词汇在哪些文档中出现,以及出现的位置信息。

4)存储索引文件:将词典和倒排列表存储在磁盘上的索引文件中,通常会进行压缩处理以减小存储空间并提升查询效率。

5)查询处理:当用户发起搜索请求时,搜索引擎会从词典中查找每个关键词对应的倒排列表,快速定位到包含这些关键词的文档。

打分规则

实际应用Elasticsearch来实现搜索功能时,我们不仅要求能搜到内容,而且还要把和用户搜索最相关的内容展示在前面。这就需要Elasticsearch的打分规则

打分规则 (_Score) 是衡量每个文档与查询条件的匹配度的评分机制。搜索结果的默认排序方式是按相关性得分(_score)从高到低排

Elasticsearch 使用 BM25 算法 来计算每个文档的得分,它是基于词频、反向文档频率、文档长度等因素来评估。

打分的主要因素:

  1. 词频: 查询词在文档中出现的次数,出现次数越多,得分越高

  2. 反向文档频率: 查询词在所有文档中出现的频率。词在越少的文档中出现,IDF值越高,得分越高。

  3. 文档长度: 较短的文档往往被认为更相关,因为查询词在短文档中占的比例更大。

下面举一个例子: 假设要在 Elasticsearch 中查询 AI 这个关键词,索引中有以下三个文档:

什么是反向文档频率?

举个例子:假如说ES中有 10 个文档,都包含了"AI”这个关键词,只有1个文档包含了“大模型”这个关键词。现在用户搜索“AI大模型”,大概率会把后面这条文档搜出来,因为更稀有。

当然,以上只是简单举例,实际上ES 计算打分规则时,会有一套较为复杂的公式

查询语法

Elasticsearch支持多种查询语法,用于不同的场景和需求,主要包括査询 DSL、EQL、SQL 等。

  1. DSL查询是一种基于 JSON 的查询语言,和 http 请求最兼容,也是 Elasticsearch 中最常用的查询方式

https://www.elastic.co/guide/en/elasticsearch/reference/7.17/query-dsl.html 忘了就查,不用背

//增加文档
POST /my_index/_doc/1      //向索引 my_index 中插入id为1的文档
{"title": "Elasticsearch入门","content": "学习如何使用Elasticsearch进行全文搜索","tags": ["elasticsearch", "search"],	"userId": 1001,"createTime": "2025-03-23 10:00:00"
}
//查询所有文档	
GET /my_index/_search
{"query": {"match_all": {}   // 匹配所有文档}
}
//根据条件查询
GET /my_index/_search
{"query": {"match": {"title": "Elasticsearch" // 在title字段中搜索包含"Elasticsearch"的文档}}
}
//更新文档 (Update)
POST /my_index/_update/1    //更新id为1的文档
{"doc": {"tags": ["elasticsearch", "search", "update"], // 更新tags字段"editTime": "2025-03-23 19:00:00" // 添加或更新editTime字段}
}
//删除文档 (Delete)
DELETE /my_index/_doc/1//根据条件删除文档
POST /my_index/_delete_by_query
{"query": {"match": {"title": "Elasticsearch"   // 删除title字段包含"Elasticsearch"的所有文档}}
}
//聚合查询 (Aggregation)
GET /my_index/_search    //统计文档中不同标签的数量
{"size": 0,     // 不返回具体文档,只返回聚合结果"aggs": {"tag_count": {"terms": {"field": "tags"   // 对tags字段进行分组统计}}}
}
//批量插入、更新和删除文档
POST /_bulk
{ "index": { "_index": "my_index", "_id": "2" } }
{ "title": "批量操作示例", "content": "演示Elasticsearch的批量API功能。", "tags": ["bulk", "api"] }
{ "update": { "_index": "my_index", "_id": "1" } }
{ "doc": { "editTime": "2025-03-23 20:00:00" } }
{ "delete": { "_index": "my_index", "_id": "3" } }
  1. EQL查询是一种用于检索时间序列 事件 的查询语言,常用于日志和安全监控场景。示例:查找特定事件
#查找 process.name 为"malware.exe"的所有进程事件,常用于安全检测中的恶意软件分析
process where process.name == "malware.exe"
  1. SQL查询:Elasticsearch 提供了类似传统数据库的 SQL 语法,对熟悉 SQL的用户来说非常方便。
# 返回 users 索引中 age大于 30 的所有用户,并按年龄降序排序。
SELECT name, age FROM users WHERE age > 30 ORDER BY age DESC
查询条件

以 ES 的 DSL 语法为例,我整理了一些常用的查询条件

查询条件介绍示例用途
match全文检索,对查询字符串进行分词并匹配字段内容。适用于文本字段。{"match": {"content": "空说是帅小伙"}}全文检索,如搜索文章、评论等。
term精确匹配,不进行分词,适用于非文本字段(如数字、日期){"term": {"status": "active"}}精确查找,如状态、ID、分类等。
terms多值精确匹配,支持多个值的精确匹配。{"terms": {"category": ["科技", "编程"]}}快速筛选多个固定值,如分类、标签等。
range范围查询,支持数值、日期等字段的范围匹配。{"range": {"age": {"gte": 18, "lte": 30}}}查询数值范围,如年龄、时间范围等。
bool组合多个查询条件,支持 must(必须满足)、should(至少满足一个)、must_not(排除)。```json
{
“bool”: {
“must”: {“match”: {“title”: “Java”}},
“must_not”: {“term”: {“status”: “deleted”}}
}
}`
组合查询,如同时满足多个条件或排除部分结果。
wildcard通配符查询,支持 *(匹配任意字符)和 ?(匹配单个字符)。{"wildcard": {"name": "li*s"}}模糊匹配,如模糊搜索用户名或编号。
exists检查字段是否存在。{"exists": {"field": "email"}}过滤存在特定字段的文档,如非空校验。
match_phrase短语匹配,保持查询词的顺序和连续性。{"match_phrase": {"content": "Elasticsearch 教程"}}匹配精确短语,如搜索特定语句或固定组合词。
multi_match在多个字段进行全文检索。```json
{
“multi_match”: {
“query”: “Java”,
“fields”: [“title”, “content”]
}
}`
跨字段搜索,如同时在标题和内容中搜索关键词。
fuzzy模糊匹配允许拼写错误,如错别字{"fuzzy": {"name": "Cahterine"}}拼写纠错,如搜索用户可能输入的拼写错误。
ids基于文档ID查询{ "ids":{ "values":["1","2","3"]}适用于根据文档 ID 查找特定文档。
Elasticsearch 客户端
  1. HTTP API: Elasticsearch 提供了 RESTful HTTP API,用户可以通过直接发送 HTTP 请求来执行索引、搜索和管理集群的操作。官方文档

  2. Kibana: 是 Elasticsearch 官方提供的可视化工具,用户可以通过 Kibana 控制台使用查询语法(如 DSL)来执行搜索、分析和数据可视化。

  3. Java REST Client: 官方提供的 Java 客户端库,用于Java 程序与 Elasticsearch 进行通信,支持索引、查询、集群等操作。官方文档

  4. Spring Data Elasticsearch: Spring 全家桶的一员,与 Elasticsearch集成,官方文档

  5. Elasticsearch SOL CLI: 命令行工具,允许通过类 SQL语法直接在命令行中査询 Elasticsearch 数据,适用于熟悉 SQL的用户。

此外,Elasticsearch 当然不只有 Java 的客户端,Python、Node.js、Go 的客户端都是支持的。在选择客户端时,要注意版本号保持兼容。

ES数据同步方案

一般对于查询搜索功能,使用 ES 来模糊搜索,但是数据是存放在数据库 MySQL 里的,所以需要把 MySQL 中的数据和 ES 进行同步,保证数据一致(以 MySQL 为主)。

数据流向: MySQL=>ES(单向) 数据同步一般有 2 个过程: 全量同步(首次) + 增量同步(新数据)

总共有 4 种主流方案

  1. 定时任务

比如1分钟1次,找到 MySQL 中过去几分钟内( 至少是定时周期的2倍 )发生改变的数据,然后更新到 ES

这种方式简单易懂,开发维护相对容易。占用资源少,缺点就是有时间差,无法做到实时同步,对大数据量的更新处理不够高效。

  1. 双写

写数据到数据库时,必须也去写 ES,更新删除数据库同理。可以通过事务保证数据一致性,先保证 MySQL 写成功,因为如果ES 写入失败了,不会触发回滚,但是可以通过定时任务 +日志+告警进行检测和修复(补偿)。

优点就是业务逻辑直接控制数据同步。利用事务部分保证 MySQL 和 ES 的数据一致性,理论上可以接近实时更新 ES。

缺点就是影响性能,每次写 MySQL时,需要同时操作 ES,增加了业务写入延迟,此外还有一致性问题

  • 如果 ES 写入失败,MySQL 事务提交成功后,ES 可能会丢失数据,
  • 如果ES 写入成功,MySQL 事务提交失败,ES 无法回滚。因此必须额外设计监控、补偿机制来检测同步失败的情况,代码复杂度增加
  1. Logstash数据同步管道

一般要配合kafka消息队列 +beats采集器,从数据库同步到ES

这种方式基于配置文件,数据同步逻辑和业务代码解耦。且引入Kafka等消息队列实现异步数据同步,并可处理高吞吐量数据。

缺点就是灵活性差,复杂的业务逻辑可能难以在配置中实现,无法处理细粒度的定制化需求。且引入额外组件,维护成本高

  1. 监听 MysQL Binlog

有任何数据变更时都能够实时监听到,并且同步到 Elasticsearch。一般不需要自己监听,可以使用现成的技术,比如Canal

在这里插入图片描述

Canal的核心原理: 数据库每次修改时,会修改binlog文件,只要监听该文件的修改,就能第一时间得到消息并处理

优点就是真正的实时同步,MySQL数据变更的第一时间同步到 ES,且Binlog是数据库自带的日志功能,只需要新增监听逻辑。

缺点就是需要引入引入Canal这样的中间件,增加了系统的复杂性和维护成本。且如果 Canal 服务出现问题,数据可能会滞后或丢失,必须设计补偿机制。

综上对于一般项目,由于数据量不大,题目更新也不频繁,容忍丢失和不一致,所以选用方案一,实现成本最低

快速安装

官网地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.14/zip-windows.html (windows安装)

Elasticsearch 更新迭代非常快,所以安装时,一定要注意慎重选择版本号!

Window安装

下载地址: https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.14.3-windows-x86_64.zip

  1. ElasticSearch目录结构如下:
目录描述
bin脚本文件,包括启动elasticsearch,安装插件,运行统计数据等
config配置文件目录,如elasticsearch配置、角色配置、jvm配置等。
jdk7.x 以后特有,自带的 java 环境
data默认的数据存放目录,包含节点、分片、索引、文档的所有数据,生产环境需要修改。
libelasticsearch依赖的Java类库
logs默认的日志文件存储路径,生产环境需要修改。
modules包含所有的Elasticsearch模块,如Cluster、Discovery、Indices等。
plugins已安装插件目录

2. 配置JDK环境

  • ES比较耗内存,建议虚拟机4G或以上内存,jvm1g以上的内存分配

  • 运行Elasticsearch,需安装并配置JDK。各个版本对Java的依赖 https://www.elastic.co/support/matrix#matrix_jvm

    • 7.0开始,内置了Java环境。ES的JDK环境变量生效的优先级配置顺序ES_JAVA_HOME>ES_HOME
    • ES_JAVA_HOME:用于指定Elasticsearch使用的Java运行时环境的路径。启动Elasticsearch时,会检查ES_JAVA_HOME环境变量并使用
    • ES_HOME:这个环境变量指定Elasticsearch的安装路径。它用于定位Elasticsearch的配置文件、插件和其他相关资源。
    • 可以参考ES的环境文件elasticsearch-env.bat

在这里插入图片描述

windows下,设置ES_JAVA_HOME和ES_HOME的环境变量

在这里插入图片描述

3. 配置ElasticSearch

编辑config/elasticsearch.yml文件

关闭security安全认证

ES 8 默认是开启Security的,初学者便于快速上手,可以关闭Security。

4. 启动ElasticSearch服务

解决启动日志乱码问题

#打开config/jvm.options 文件—>末尾添加
-Dfile.encoding=GBK

进入bin目录,点击elasticsearch.bat件启动 ES 服务

在这里插入图片描述

注意:9300 端口为 Elasticsearch集群间组件的通信端口,9200 端口为浏览器访问的 http

打开浏览器(推荐使用谷歌浏览器),输入地址:http://localhost:9200,测试结果

在这里插入图片描述

Linux安装

准备linux安装环境: centos7

# 注意:ES不允许使用root账号启动服务,如果你当前账号是root,则需要创建一个专有账户
# 为elaticsearch创建用户
adduser fox
passwd fox

通过fox用户登录,下载ElasticSearch并解压

# centos7  通过fox用户进入
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.14.3-linux-x86_64.tar.gz
tar -xzf elasticsearch-8.14.3-linux-x86_64.tar.gz
cd elasticsearch-8.14.3/ # 将ES安装包的所有者和组更改为fox用户
chown -R fox:fox elasticsearch-8.14.3

配置JDK环境(可选)

# 进入fox用户主目录,比如/home/fox目录下,设置用户级别的环境变量
vim .bash_profile
#设置ES_JAVA_HOME和ES_HOME的路径
export ES_JAVA_HOME=/home/fox/elasticsearch-8.14.3/jdk/
export ES_HOME=/home/fox/elasticsearch-8.14.3
#执行以下命令使配置生效
source .bash_profile

修改config/elasticsearch.yml配置文件

vim elasticsearch.yml#配置节点对外提供服务的地址以及集群内通信的ip地址,默认为回环地址127.0.0.1 和[::1]
#配置为0.0.0.0开启远程访问支持  
network.host: 0.0.0.0
#指定节点为单节点,可以绕过引导检查   初学者建议设置为此开发模式 
discovery.type: single-node#初学者建议关闭security安全认证
xpack.security.enabled: false

配置JVM参数(可选

修改config/jvm.options配置文件,调整jvm堆内存大小

vim jvm.options -Xms4g -Xmx4g

配置的建议:

  • Xms(JVM 启动时分配的最小堆内存)和Xms(JVM 在运行过程中能够分配的最大堆内存)设置成—样
  • Xmx不要超过机器内存的50%
  • 不要超过30GB - https://www.elastic.co/cn/blog/a-heap-of-trouble

6)启动ElasticSearch服务

#注意:es默认不能用root用户启动
#fox用户下启动ES
bin/elasticsearch # -d 后台启动
bin/elasticsearch -d

打开本地浏览器(推荐使用谷歌浏览器),输入地址:http://192.168.65.47:9200 (换成linux环境对应的ip),测试结果如下:

在这里插入图片描述

开发模式和生产模式
  • 开发模式:开发模式是默认配置(未配置集群发现设置),如果用户只是出于学习目的,而引导检查会把很多用户挡在门外,所以ES提供了一个设置项discovery.type=single-node。此项配置为指定节点为单节点,可以绕过引导检查。
  • 生产模式:当用户修改了有关集群的相关配置会触发生产模式,在生产模式下,服务启动会触发ES的引导检查或者叫启动检查(bootstrap checks)
    • 引导检查就是在服务启动之前对一些重要的配置项进行检查
    • 引导检查包括对JVM大小、内存锁、虚拟内存、最大线程数、集群发现相关配置等相关的检查,如果某一项或者几项的配置不合理,ES会拒绝启动服务,并且在开发模式下的某些警告信息会升级成错误信息输出。
    • 这种设定虽然增加了用户的使用门槛,但是避免了日后产生更大的问题。
常用配置参数

参考文档:https://www.elastic.co/guide/en/elasticsearch/reference/8.14/important-settings.html

  • cluster.name

当前节点所属集群名称,多个节点如果要组成同一个集群,那么集群名称一定要配置成相同。默认值elasticsearch,生产环境建议根据ES集群的使用目的修改成合适的名字。

  • node.name

当前节点名称,默认值当前节点部署所在机器的主机名,所以如果一台机器上要起多个ES节点的话,需要通过配置该属性明确指定不同的节点名称。

  • path.data

配置数据存储目录,比如索引数据等,默认值 $ES_HOME/data,生产环境下强烈建议部署到另外的安全目录,防止ES升级导致数据被误删除。

  • path.logs

配置日志存储目录,比如运行日志和集群健康信息等,默认值 $ES_HOME/logs,生产环境下强烈建议部署到另外的安全目录,防止ES升级导致数据被误删除。

  • bootstrap.memory_lock

配置ES启动时是否进行内存锁定检查,默认值true。

ES对于内存的需求比较大,一般生产环境建议配置大内存,如果内存不足,容易导致内存交换到磁盘,严重影响ES的性能。所以默认启动时进行相应大小内存的锁定,如果无法锁定则会启动失败。

如果该参数配置为true的话很可能导致无法锁定内存以致ES无法成功启动,此时可以修改为false。

  • network.host

节点对外提供服务的地址以及集群内通信的ip地址,默认值为当前节点所在机器的本机回环地址127.0.0.1 和[::1],这就导致默认情况下只能通过当前节点所在主机访问当前节点。

  • http.port

配置当前ES节点对外提供服务的http端口,默认 9200

  • transport.port

节点通信端口号,默认 9300

  • discovery.seed_hosts

配置参与集群节点发现过程的主机列表,说白一点就是集群中所有节点所在的主机列表,可以是具体的IP地址,也可以是可解析的域名。

  • cluster.initial_master_nodes

配置ES集群初始化时参与master选举的节点名称列表,必须与node.name配置的一致。ES集群首次构建完成后,应该将集群中所有节点的配置文件中的cluster.initial_master_nodes配置项移除,重启集群或者将新节点加入某个已存在的集群时切记不要设置该配置项。

可视化Kibana安装

Kibana是一个开源分析和可视化平台,旨在与Elasticsearch协同工作。

参考文档:https://www.elastic.co/guide/en/kibana/8.14/get-started.html

下载地址:https://www.elastic.co/cn/downloads/past-releases#kibana

  1. 下载并解压缩Kibana
#windows
https://artifacts.elastic.co/downloads/kibana/kibana-8.14.3-windows-x86_64.zip#linux
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.14.3-linux-x86_64.tar.gz
tar -zxvf kibana-8.14.3-linux-x86_64.tar.gz
cd kibana-8.14.3
  1. 修改Kibana.yml配置文件
vim config/kibana.yml#指定Kibana服务器监听的端口号
server.port: 5601 
#指定Kibana服务器绑定的主机地址  
server.host: "0.0.0.0"  
#指定Kibana连接到的Elasticsearch实例的访问地址
elasticsearch.hosts: ["http://localhost:9200"]  
#将 Kibana 的界面语言设置为简体中文
i18n.locale: "zh-CN"   
  1. 运行Kibana

windows:直接执行kibana.bat

Linux:注意:kibana也需要非root用户启动

#启动kibana服务
bin/kibana
#后台启动,并将日志写入到logs/kibana.log
nohup bin/kibana > logs/kibana.log 2>&1 &#查询kibana进程
netstat -tunlp | grep 5601
  1. 访问Kibana: http://localhost:5601

在这里插入图片描述

cat API
/_cat/allocation         #查看单节点的shard分配整体情况
/_cat/shards          #查看各shard的详细情况
/_cat/shards/{index}     #查看指定分片的详细情况
/_cat/master          #查看master节点信息
/_cat/nodes           #查看所有节点信息
/_cat/indices         #查看集群中所有index的详细信息
/_cat/indices/{index}      #查看集群中指定index的详细信息
/_cat/segments        #查看各index的segment详细信息,包括segment名, 所属shard, 内存(磁盘)占用大小, 是否刷盘
/_cat/segments/{index}#查看指定index的segment详细信息
/_cat/count           #查看当前集群的doc数量
/_cat/count/{index}   #查看指定索引的doc数量
/_cat/recovery        #查看集群内每个shard的recovery过程.调整replica。
/_cat/recovery/{index}#查看指定索引shard的recovery过程
/_cat/health          #查看集群当前状态:红、黄、绿
/_cat/pending_tasks   #查看当前集群的pending task
/_cat/aliases         #查看集群中所有alias信息,路由配置等
/_cat/aliases/{alias} #查看指定索引的alias信息
/_cat/thread_pool     #查看集群各节点内部不同类型的threadpool的统计信息,
/_cat/plugins         #查看集群各个节点上的plugin信息
/_cat/fielddata       #查看当前集群各个节点的fielddata内存使用情况
/_cat/fielddata/{fields}     #查看指定field的内存使用情况,里面传field属性对应的值
/_cat/nodeattrs              #查看单节点的自定义属性
/_cat/repositories           #输出集群中注册快照存储库
/_cat/templates              #输出当前正在存在的模板信息
安装中文分词插件
在线安装

以安装analysis-icu这个分词插件为例

analysis-icu功能:

  • 基于ICU(International Components for Unicode)库,提供高级的文本分析和处理功能。
  • 支持多语言和复杂的Unicode文本处理。
  • 包含ICU分词器(ICU Tokenizer)和ICU标准化过滤器(ICU Normalizer)。

analysis-icu应用场景:

  • 多语言文本分析,适用于处理各种语言的文本。
  • 支持Unicode标准化和处理复杂字符。
  • 提供高级的文本处理功能,如正则表达式替换、文本转换等。
#查看已安装插件
bin/elasticsearch-plugin list
#安装插件
bin/elasticsearch-plugin install analysis-icu
#删除插件
bin/elasticsearch-plugin remove analysis-icu
# 注意:安装和删除完插件后,需要重启ES服务才能生效。
测试分词效果
POST _analyze
{"analyzer":"icu_analyzer","text":"中华人民共和国"
}

在这里插入图片描述

离线安装

本地下载相应的插件,解压,然后手动上传到elasticsearch的plugins目录,然后重启ES实例就可以了。

比如ik中文分词插件:https://github.com/medcl/elasticsearch-analysis-ik

注意:ik分词器插件和ES版本必须一一对应,否则会出现兼容性问题导致ES启动失败。

当前ik分词器插件最新版本还只支持到ES8.4.1,而我们使用的ES版本是8.14.3,安装后会出现兼容性问题。那如何解决?

可以从https://release.infinilabs.com/analysis-ik/stable/ 下载ES8.14.3对应版本的分词器

测试分词效果

#ES的默认分词设置是standard,会单字拆分
POST _analyze
{"analyzer":"standard","text":"中华人民共和国"
}#ik_smart:会做最粗粒度的拆
POST _analyze
{"analyzer": "ik_smart","text": "中华人民共和国"}#ik_max_word:会将文本做最细粒度的拆分
POST _analyze
{"analyzer":"ik_max_word","text":"中华人民共和国"
}

创建索引时可以指定IK分词器作为默认分词器

# 创建索引,指定默认分词器
PUT /employee
{"settings" : {"index" : {"analysis.analyzer.default.type": "ik_max_word"  //这里指定了ik_max_word类型索引}}
}# 查看索引setting信息
GET /employee/_settings

在这里插入图片描述

也可以针对字段配置IK分词器

//创建索引
PUT /index
// 指定映射
POST /index/_mapping
{"properties": { //这是一个包含字段定义的JSON对象。在这个例子中,它只包含了一个字段content"content": {  //索引中要定义的字段名//指定content字段的数据类型为text。在Elasticsearch中,text类型用于全文搜索的文本字段,可以被分词器(analyzer)处理成多个词条(tokens)用于索引和搜索。"type": "text", //指定在索引(写入)content字段时使用的分词器为ik_max_word。ik_max_word是IK分词器插件提供的一个分词器,它会对文本进行最细粒度的切分"analyzer": "ik_max_word",//指定在搜索(查询)content字段时使用的分词器为ik_smart。ik_smart是IK分词器的另一种分词模式,它尝试对文本进行更智能的切分,以提高搜索的准确率 "search_analyzer": "ik_smart"}}
}//索引文档,也就是插入文档,分别向索引 index 中添加了四个文档
POST /index/_create/1
{"content":"美国留给伊拉克的是个烂摊子吗"}
POST /index/_create/2
{"content":"公安部:各地校车将享最高路权"}
POST /index/_create/3
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
POST /index/_create/4
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}//带高亮的查询,用于搜索所有 content 字段中包含“中国”这个词的所有文档
POST /index/_search
{"query": {"match": {"content": "中国"}},"highlight": {"pre_tags": ["<tag1>","<tag2>"],"post_tags": ["</tag1>","</tag2>"],"fields": {"content": {}}}
}

后端开发

ES搭建

目标:安装 Elasticsearch 和 Kibana,能够在 Kibana 査看到 Elasticsearch 存储的数据。

由于项目用的Spring Boot 2.x版本,对应的 Spring Data Elasticsearch 客户端版本是 4.x,支持的 Elasticsearch是 7.x,建议7.17的版本很稳定

1.安装 Elasticsearch
  • 参考官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.17/setup.htmlWindows
  • 解压安装:https://www.elastic.co/guide/en/elasticsearch/reference/7.17/zip-windows.html
  • 其他操作系统安装:https://www.elastic.co/guide/en/elasticsearch/reference/7.17/targz.html

安装完成后进入 es 目录cmd并执行启动命令

.\bin\elasticsearch.bat#用 CURL 测试是否启动成功
curl -X GET "localhost:9200/?pretty"

在这里插入图片描述

2.安装 Kibana

注意,只要是同一套技术,所有版本必须一致!此处都用 7.17 版本!

  • 参考官方文档:https://www.elastic.co/guide/en/kibana/7.17/introduction.html
  • 安装Kibana: https://www.elastic.co/guide/en/kibana/7.17/install.html

安装完成后进入 kibana 目录并执行启动命令,访问 http://localhost:5601/,即可开始使用。

.\bin\kibana.bat

在这里插入图片描述

但 kibana 默认是英文,不变阅读,可以修改 config/kibana.yml 中的国际化配置,注意,目前 Kibana 面板没有增加权限校验,所有人都能访问,所以请勿在线上直接部署!
在这里插入图片描述

测试

利用 Kibana 的开发工具来操作 Elasticsearch 的数据,比如查询:
在这里插入图片描述

验证下分词器的效果,比如使用标准分词器,效果如图,英文被识别为了一个词,但中文未被识别成一个词,而是分开的

POST /_analyze
{"analyzer": "standard", "text": "空说帅 giegie,haha"
}

在这里插入图片描述

3.安装IK 中文分词器(ES 插件)

开源地址:https://github.com/medcl/elasticsearch-analysis-ik

直接按照官方指引安装即可,注意下载和我们 Elasticsearch 一致的版本,可以在这里找到各版本的插件包:https://release.infinilabs.com/analysis-ik/stable/

在 ES 安装目录下执行

.\bin\elasticsearch-plugin.bat install https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-7.17.23.zip#重启ES即可
.\bin\elasticsearch.bat

IK分词器插件为我们提供了两个分词器: ik_smartik_max_word

  • 前者是智能分词,尽量选择最像一个词的拆分方式,比如“好学生”会被识别为一个词。
  • 后者尽可能地分词,可以包括组合词,比如“好学生”会被识别为3个词: 好学生、好学、学生

测试

POST /_analyze
{"analyzer": "ik_smart", "text": "人工智能正在崛起"
}

在这里插入图片描述

有时候分词不准,这个时候可以利用官方提供的插件支持自定义词典。可以按照官方文档配置。

索引设计
设计索引

为了将MySQL题目表数据导入到ES中并实现分词搜索,需要为索引定义mapping映射,用于定义字段的类型、分词器及其索引方式。

相当于数据库,建表时我们要考虑索引,同样ES建立索引时,要考虑到字段选取、分词器、字段格式等问题。

基于我们数据库的表结构和需求,我们可以定义title、content、answer等字段使用分词搜索,同时为其他字段指定适当的类型。映射如下

{"mappings": {"properties": {// 标题字段,使用ik_max_word分词器进行索引分析,ik_smart分词器进行搜索分析"title": {"type": "text",      // 数据类型为文本"analyzer": "ik_max_word",       // 索引时使用的分词器,ik_max_word会对文本进行细粒度分词"search_analyzer": "ik_smart",   // 搜索时使用的分词器,ik_smart会对文本进行粗粒度分词"fields": {//子字段作用:允许同一个字段根据不同的目的以不同的方式被索引和搜索  "keyword": {           // 定义一个子字段,用于精确匹配,比如过滤、排序或聚合操作,希望整个字段值作为一个整体来处理,而不是被分词"type": "keyword",   // 其数据类型为关键字,不会被分词"ignore_above": 256   // 忽略超过256个字符的值,因为标题一般不会很长,很少精确匹配}}},// 内容字段,使用ik_max_word分词器进行索引分析,ik_smart分词器进行搜索分析"content": {"type": "text",                 // 数据类型为文本"analyzer": "ik_max_word",     // 索引时使用的分词器,细粒度分词"search_analyzer": "ik_smart"   // 搜索时使用的分词器,粗粒度分词},// 标签字段,数据类型为关键字,适合精确匹配"tags": {"type": "keyword"   // 数据类型为关键字,不会被分词},// 答案字段,使用ik_max_word分词器进行索引分析,ik_smart分词器进行搜索分析"answer": {"type": "text",              // 数据类型为文本"analyzer": "ik_max_word",       // 细粒度分词"search_analyzer": "ik_smart"   // 粗粒度分词},// 用户ID字段,数据类型为长整型"userId": {"type": "long" // 数据类型为长整型},// 编辑时间字段,数据类型为日期,格式为yyyy-MM-dd HH:mm:ss"editTime": {"type": "date", // 数据类型为日期"format": "yyyy-MM-dd HH:mm:ss" // 日期格式},// 创建时间字段,数据类型为日期,格式为yyyy-MM-dd HH:mm:ss"createTime": {"type": "date", // 数据类型为日期"format": "yyyy-MM-dd HH:mm:ss" // 日期格式},// 更新时间字段,数据类型为日期,格式为yyyy-MM-dd HH:mm:ss"updateTime": {"type": "date", // 数据类型为日期"format": "yyyy-MM-dd HH:mm:ss" // 日期格式},// 是否删除字段,数据类型为关键字,适合精确匹配"isDelete": {"type": "keyword" // 数据类型为关键字,不会被分词}}}
}

为什么不显示指定id 字段?

ES中,每个文档都有一个唯一的_id字段来标识文档,不需要显式定义 id 字段,因为ES会自动生成 id,在插入数据时,你可以手动指定id

由于id 是内部的系统字段,默认作为主键使用,因此在mappings中通常不需要显式定义。

如果你想让某个字段( 如 userid )作为id ,可以在插入文档时指定该字段的值作为 id 。比如:

PUT /index/_doc/<custom_id>
{"userId": 1001,"title": "Example"
}
新建索引

可以通过如下命令创建索引,在 Kibana开发者工具中执行、或者用 CURL 调用 Elasticsearch 执行均可

下面的注释可以用AI消除掉,然后到可视化平台执行

PUT /question_v1     //创建 
{// 定义索引的别名(alias)"aliases": {"question": {}  // 创建一个名为 "question" 的别名,指向当前索引 "question_v1"},"mappings": {   "properties": {// 标题字段,使用ik_max_word分词器进行索引分析,ik_smart分词器进行搜索分析"title": {"type": "text",      // 数据类型为文本"analyzer": "ik_max_word",       // 索引时使用的分词器,ik_max_word会对文本进行细粒度分词"search_analyzer": "ik_smart",   // 搜索时使用的分词器,ik_smart会对文本进行粗粒度分词"fields": {//子字段作用:允许同一个字段根据不同的目的以不同的方式被索引和搜索  "keyword": {           // 定义一个子字段,用于精确匹配,比如过滤、排序或聚合操作,希望整个字段值作为一个整体来处理,而不是被分词"type": "keyword",   // 其数据类型为关键字,不会被分词"ignore_above": 256   // 忽略超过256个字符的值,因为标题一般不会很长,很少精确匹配}}},// 内容字段,使用ik_max_word分词器进行索引分析,ik_smart分词器进行搜索分析"content": {"type": "text",                 // 数据类型为文本"analyzer": "ik_max_word",     // 索引时使用的分词器,细粒度分词"search_analyzer": "ik_smart"   // 搜索时使用的分词器,粗粒度分词},// 标签字段,数据类型为关键字,适合精确匹配"tags": {"type": "keyword"   // 数据类型为关键字,不会被分词},// 答案字段,使用ik_max_word分词器进行索引分析,ik_smart分词器进行搜索分析"answer": {"type": "text",              // 数据类型为文本"analyzer": "ik_max_word",       // 细粒度分词"search_analyzer": "ik_smart"   // 粗粒度分词},// 用户ID字段,数据类型为长整型"userId": {"type": "long" // 数据类型为长整型},// 编辑时间字段,数据类型为日期,格式为yyyy-MM-dd HH:mm:ss"editTime": {"type": "date", // 数据类型为日期"format": "yyyy-MM-dd HH:mm:ss" // 日期格式},// 创建时间字段,数据类型为日期,格式为yyyy-MM-dd HH:mm:ss"createTime": {"type": "date", // 数据类型为日期"format": "yyyy-MM-dd HH:mm:ss" // 日期格式},// 更新时间字段,数据类型为日期,格式为yyyy-MM-dd HH:mm:ss"updateTime": {"type": "date", // 数据类型为日期"format": "yyyy-MM-dd HH:mm:ss" // 日期格式},// 是否删除字段,数据类型为关键字,适合精确匹配"isDelete": {"type": "keyword" // 数据类型为关键字,不会被分词}}}
}

在这里插入图片描述

alias别名的作用?

零停机切换

根据需求创建一个新的索引。例如,如果当前索引名为 index_v1,则可以创建一个新索引 index_v2

PUT /index_v2
{"settings": {"number_of_shards": 3,"number_of_replicas": 2},"mappings": {"properties": {"title": {"type": "text","analyzer": "ik_max_word"},"content": {"type": "text","analyzer": "ik_smart"}}}
}

将旧索引中的数据复制到新索引中。可以使用 Elasticsearch 的 _reindex API 实现。

POST /_reindex
{"source": {"index": "index_v1"  // 源索引},"dest": {"index": "index_v2"  // 目标索引}
}

使用别名将查询流量从旧索引切换到新索引。假设当前别名 my_alias 指向 index_v1,现在将其切换到 index_v2

POST /_aliases
{"actions": [{ "remove": { "index": "index_v1", "alias": "my_alias" } },  // 移除旧索引的别名{ "add": { "index": "index_v2", "alias": "my_alias" } }      // 添加新索引的别名]
}

确认新索引运行正常后,可以删除旧索引以释放存储空间。实现无缝切换

相关文章:

ElasticSearch快速入门--实现分词搜索

分词题目搜索 使用Elasticsearch实现题目数据的存储和分词搜索&#xff0c;需要将数据库的数据同步到 Elasticsearch。 ElasticSearch入门 ElasticSearch&#xff08;简称ES&#xff09;是一个开源的分布式搜索和数据分析引擎&#xff0c;用Java开发并且是当前最流行的开源的…...

解读探寻数字影像新路径:树莓集团现状最新进展

树莓集团在数字影像领域展现出强劲的发展势头&#xff0c;其核心战略在于构建完整的数字产业生态链。 产业园建设与运营 全国布局&#xff1a; 树莓集团已在全国范围内建设并运营多个国际数字影像产业园&#xff0c;旨在打造区域性的数字产业高地。 成都案例&#xff1a; 在成…...

数据治理之数据仓库

本文主要阐述了数据仓库在大数据平台项目中的地位和重要性,对目前市场上数据仓库主流设计进行分析说明,讲述了通用数据仓库设计上所应考虑的因素。 数据仓库介绍 数据仓库是一个过程而不是一个项目;数据仓库是一个环境,而不是一件产品。数据仓库提供用户用于决策支持的当前…...

自由学习记录(48)

When the material of an object disappears, the light and shadow also disappear (synchronized) Tiling And Offset 显示的是四分之一前面的&#xff0c;不是中间的四分之一块&#xff0c; 准确的还是跟着视频学&#xff0c; &#xff0c;AI一些回答会散发一种“奇怪的错味…...

zynq7020 最小ps环境速通

1 简介 环境: 硬件 野火 zynq 皓月 xc7z020clg400-1 软件: vivado2020.2 vitis2020.2 petalinux2020.2 搭建 ps 的最小环境,跑裸机 helloworld 测试 uart 和 ddr,跑 linux 系统. 2 ps 环境搭建 2.1 uart 2.1 ddr 2.1 删除 pl 接口,包括 pl 时钟,pl 时钟复位,axi_m. 具体略…...

Modbus RTU ---> Modbus TCP透传技术实现(Modbus透传、RS485透传、RTU透传)分站代码实现

文章目录 Modbus RTU到Modbus TCP透传技术实现1. 透传技术概述1.1 透传基本原理- 协议帧格式转换- 地址映射与管理- 通信时序适配- 错误检测与处理 2. 透传网关硬件架构2.1 典型硬件结构- 微控制器/处理器(ARM、STM32等)- RS-485/RS-232收发器- 以太网控制器(如W5500)- 电源管理…...

【SOC 芯片设计 DFT 学习专栏 -- IDDQ 测试 与 Burn-In 测试】

文章目录 IDDQ 测试与 Burn-In 测试IDDQ 测试工作原理测试过程优点局限性示例 2. Burn-In 测试工作原理测试过程优点局限性示例 总结对比 IDDQ 测试和 Burn-in 测试&#xff1a; IDDQ 测试与 Burn-In 测试 本文将详细介绍 DFT 中 IDDQ测试 和 burn-in测试模式 IDDQ 测试 IDD…...

Rust从入门到精通之进阶篇:19.Rust 生态系统

Rust 生态系统 Rust 拥有一个丰富而活跃的生态系统,提供了各种库和框架来支持不同领域的开发。在本章中,我们将探索 Rust 生态系统中的主要组件,了解常用的库和工具,以及如何在项目中有效地使用它们。 Rust 包管理:Cargo 和 crates.io Cargo 回顾 Cargo 是 Rust 的构建…...

【HarmonyOS Next】三天撸一个BLE调试精灵

【HarmonyOS Next】三天撸一个BLE调试精灵 一、功能介绍 BLE调试精灵APP属于工具类APP&#xff0c;在用户使用的过程中&#xff0c;负责调试BLE设备从机端&#xff0c;比如蓝牙耳机、低功耗设备、带有BLE的空调等设备&#xff0c;可以在页面中清晰看到设备的厂商&#xff0c;…...

STM32实现智能温控系统(暖手宝):PID 算法 + DS18B20+OLED 显示,[学习 PID 优质项目]

一、项目概述 本文基于 STM32F103C8T6 单片机&#xff0c;设计了一个高精度温度控制系统。通过 DS18B20 采集温度&#xff0c;采用位置型 PID 算法控制 PWM 输出驱动 MOS 管加热Pi膜&#xff0c;配合 OLED 实时显示温度数据。系统可稳定将 PI 膜加热至 40℃&#xff0c;适用于…...

【docker】docker-compose安装RabbitMQ

docker-compose安装RabbitMQ 1、配置docker-compose.yml文件&#xff08;docker容器里面的目录请勿修改&#xff09;2、启动mq3、访问mq4、查看服务器映射目录5、踩坑5.1、权限不足 1、配置docker-compose.yml文件&#xff08;docker容器里面的目录请勿修改&#xff09; versi…...

如何突破MacBook苹果电脑Cursor限制:免费版的解决方法

Macbook苹果电脑无限白嫖Cursor|解决免费版限制问题|达到50次150次续杯|arm|intel 如何突破MacBook苹果电脑Cursor限制&#xff1a;免费版的解决方法 前言 本文介绍了如何在MacBook上突破Cursor免费版的使用限制。请遵循以下步骤进行操作。 操作步骤 进入程序目录&#xff1a;…...

网络原理之传输层

前文我们了解 应用层 传输层 网络层 数据链路层 物理层 这五层结构,此文我先讨论传输层相关的知识 1. 传输层 负责数据能够从发送端传输到接收端. 1.1 端口号 端⼝号(Port)标识了⼀个主机上进行通信的不同的应用程序 端口号范围划分: 0-1023:知名端口号,HTTP,FTP,SSH等这些…...

一个免费 好用的pdf在线处理工具

pdf24 doc2x 相比上面能更好的支持数学公式。但是收费...

新书速览|云原生Kubernetes自动化运维实践

《云原生Kubernetes自动化运维实践》 本书内容&#xff1a; 《云原生Kubernetes自动化运维实践》以一名大型企业集群运维工程师的实战经验为基础&#xff0c;全面系统地阐述Kubernetes&#xff08;K8s&#xff09;在自动化运维领域的技术应用。《云原生Kubernetes自动化运维实践…...

解决安卓so库异常无法打印堆栈的问题

解决方案&#xff1a; 设置 android:extractNativeLibs"true" 直接在 AndroidManifest.xml 里加上&#xff1a; <applicationandroid:extractNativeLibs"true"> </application>这样&#xff0c;so 文件会被解压&#xff0c;崩溃时可以正常打…...

996引擎-接口测试:背包

996引擎-接口测试:背包 背包测试NPC参考资料背包测试NPC CONSTANT = require("Envir/QuestDiary/constant/CONSTANT.lua"); MsgUtil = require("Envir/QuestDiary/utils/996/MsgUtil.lua");...

红数码影视(RED Digital Cinema)存储卡格式化后的恢复方法

红数码影视(RED Digital Cinema)的摄像机可以生成两种RAW级高清视频文件&#xff0c;一种是R3D&#xff0c;一种是MOV。其中MOV属于苹果(apple)公司的QT视频封装结构&#xff0c;使用的视频编码是Apple ProRes;而R3D则是RED公司自创的RAW视频文件&#xff0c;这种文件解码需要使…...

若依前端框架增删改查

1.下拉列表根据数据库加载 这个是用来查询框 绑定了 change 事件来处理站点选择变化后的查询逻辑。 <el-form-item label"站点选择" prop"stationId" v-has-permi"[ch:m:y]"><el-select v-model"queryParams.stationId" pl…...

YARN Cluster模式和Client模式的区别是什么

在 Apache Spark 的 YARN 部署中&#xff0c;Cluster 模式和Client 模式的核心区别在于 Driver 的启动位置和客户端&#xff08;提交任务的机器&#xff09;的角色。以下是两者的详细对比&#xff1a; 1. 核心区别概览 特性YARN Cluster 模式YARN Client 模式Driver 位置在 YA…...

哪吒汽车:一边熬夜蹦迪,一边找药投医

两年前&#xff0c;威马CEO沈晖发了个短视频&#xff0c;内容是“活下去&#xff0c;像牲口一样活下去”。 如今最能体会沈晖当时心情的&#xff0c;估计就是方运舟了。 作为哪吒汽车创始人兼董事长&#xff0c;他连续多次被限高&#xff0c;为了让哪吒汽车活下去&#xff0c…...

Java 集合 List、Set、Map 区别与应用

一、核心特性对比 二、底层实现与典型差异 ‌List‌ ‌ArrayList‌&#xff1a;动态数组结构&#xff0c;随机访问快&#xff08;O(1)&#xff09;&#xff0c;中间插入/删除效率低&#xff08;O(n)&#xff09;‌‌LinkedList‌&#xff1a;双向链表结构&#xff0c;头尾操作…...

天地图InfoWindow插入React自定义组件

截至2025年03月21日天地图的Marker不支持添加Label; 同时Label和Icon是不支持自定义HTMLElement只支持String&#xff1b;目前只有InfoWindow支持自定义HTMLElement; 效果图 React核心api import ReactDOM from react-dom/client const content document.createElement(div);…...

深度学习PyTorch之动态计算图可视化 - 使用 torchviz 生成计算图

序号系列文章1深度学习训练中GPU内存管理2深度学习PyTorch之数据加载DataLoader3深度学习 PyTorch 中 18 种数据增强策略与实现4深度学习pytorch之简单方法自定义9类卷积即插即用5深度学习PyTorch之13种模型精度评估公式及调用方法6深度学习pytorch之4种归一化方法&#xff08;…...

拓展知识三:编码学及密码学

编码和密码的区别 研究密码变化的客观规律&#xff0c;应用于编制密码以保守通信秘密的&#xff0c;称为编码学&#xff1b;应用于破译密码以获取通信情报的&#xff0c;称为破译学&#xff0c;总称密码学。 编码和密码是两个不同的概念&#xff0c;它们的区别如下&#xff1a;…...

【商城实战(54)】解锁商城国际化密码:内容管理全攻略

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…...

JS 应用WebPack 打包器第三方库 JQuery安装使用安全检测

# 打包器 -WebPack- 使用 & 安全 参考&#xff1a; https://mp.weixin.qq.com/s/J3bpy-SsCnQ1lBov1L98WA Webpack 是一个模块打包器。在 Webpack 中会将前端的所有资源文件都作为模块处理。 它将根据模块的依赖关系进行分析&#xff0c;生成对应的资源。 五个核心概…...

【嵌入式硬件】三款DCDC调试笔记

关于开关电源芯片&#xff0c;重点关注输入电源范围、输出电流、最低压降。 1.MP9943: 以MP9943为例&#xff0c;输入电压范围4-36V&#xff0c;输出最大电流3A&#xff0c;最低压降为0.3V 调整FB使正常输出为5.06V 给定6V空载、5V空载、5V带2A负载的情况&#xff1a; 6V带2A…...

深入理解 HTML5 Web Workers:提升网页性能的关键技术解析

深入理解 HTML5 Web Workers&#xff1a;提升网页性能的关键技术解析 引言1. 什么是 Web Workers&#xff1f;Web Workers 的特点&#xff1a; 2. Web Workers 的使用方式2.1 创建一个 Web Worker步骤 1&#xff1a;创建 Worker 文件步骤 2&#xff1a;在主线程中调用 Worker 3…...

计算机网络的分类——按照按拓扑结构分类

计算机的拓扑结构是引用拓扑学中研究和大小、形状无关的点、线关系的方法&#xff0c;将网络中的计算机和通信设备抽象为一个点&#xff0c;把传输介质抽象成一条线&#xff0c;由点和线组成的几何图形就是计算机网络的拓扑结构。计算机网络的拓扑结构主要由通信子网决定&#…...

AI大白话(四):自然语言处理——AI是如何理解和生成人类语言的?

🌟引言: 专栏:《AI大白话》 AI大白话(一):5分钟了解AI到底是什么? AI大白话(二):机器学习——AI是怎么“学习“的? AI大白话(三):深度学习——AI的‘大脑‘是如何构建的? 大家好!欢迎回到"AI大白话"系列。前面我们聊了AI的基本概念、机器学习的原理…...

Android第六次面试总结(Java设计模式篇一)

单例模式属于创建型设计模式&#xff0c;它保证一个类仅有一个实例&#xff0c;并且提供一个全局访问点来获取该实例。下面为你详细阐述单例模式的好处和坏处。 好处 资源优化&#xff1a;单例模式能保证一个类只有一个实例&#xff0c;这对于那些创建和销毁开销大的对象&…...

如何在 React 项目中进行服务器端渲染(SSR),它有什么优势

大白话如何在 React 项目中进行服务器端渲染&#xff08;SSR&#xff09;&#xff0c;它有什么优势 什么是服务器端渲染&#xff08;SSR&#xff09; 在传统的 React 项目里&#xff0c;页面的渲染工作是在浏览器里完成的。也就是当你访问一个网页时&#xff0c;浏览器会先下…...

JVM 01

今天是2025/03/20 16:36 day 09 总路线请移步主页Java大纲相关文章 今天进行JVM前二个模块的归纳 首先是JVM的相关内容概括的思维导图 以下是针对思维导图中 内存管理 和 垃圾回收&#xff08;GC&#xff09; 模块的详细说明&#xff1a; 1. 内存管理&#xff08;运行时数据…...

MATLAB 调用arduino uno

为了授课&#xff0c;必须重新把arduino用上。 采用MATLAB编码&#xff0c;可以简化相关程序授课部分 1 安装包 MATLAB Support Package for Arduino Hardware - File Exchange - MATLAB Central (mathworks.com) 需要这个插件。 当然也可下载simulink的模块&#xff0c;但…...

WPS宏开发手册——JSA语法

目录 系列文章2、JSA语法2.1、打印输出2.2、注释2.3、变量2.4、数据类型2.5、函数2.6、运算符2.7、比较2.8、if else条件语句2.9、for循环2.10、Math对象&#xff08;数字常用方法&#xff09;2.11、字符串常用方法2.12、数组常用方法 系列文章 使用、工程、模块介绍 JSA语…...

linux如何释放内存缓存

[rootredis ~]# sync #将内存缓存数据强制写入磁盘&#xff08;保存数据后再做释放&#xff09; [rootredis ~]# echo 1 > /proc/sys/vm/drop_caches #释放内存缓存...

2025年渗透测试面试题总结-某360-企业蓝军面试复盘 (题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 360-企业蓝军 一、Shiro绕WAF实战方案 二、WebLogic遭遇WAF拦截后的渗透路径 三、JBoss/WebLogic反序…...

Atlas 800I A2 双机直连部署DeepSeek-R1-w8a8

一、环境信息 1.1、硬件信息 Atlas 800I A2 * 2 1.2、环境信息 操作系统&#xff1a;openEuler 22.03 LTS NPU驱动&#xff1a;Ascend-hdk-910b-npu-driver 24.1.0 linux-aarch64.run NPU固件&#xff1a;Ascend-hdk-910b-npu-firware 7.5.0.3.220.run MindIE镜像&#xff…...

OpenHarmony 入门——ArkUI 跨页面数据同步和页面级UI状态存储LocalStorage小结(二)

文章大纲 引言一、在代码逻辑使用LocalStorage二、从UI内部使用LocalStorage三、LocalStorageProp和LocalStorage单向同步四、LocalStorageLink和LocalStorage双向同步五、兄弟组件之间同步状态变量七、将LocalStorage实例从UIAbility共享到一个或多个视图 引言 前面一篇文章主…...

自我革命!优利德全面进入智能示波器时代

AI重构电子测试新范式 春节期间&#xff0c;DeepSeek&#xff08;深度求索&#xff09;火遍全网。作为国内首个全面对标GPT-4技术架构的AI大模型&#xff0c;DeepSeek凭借其自主研发的通用大语言模型体系&#xff0c;涵盖了从7B到超千亿参数的完整模型矩阵&#xff0c;在数学推…...

Vue3 实战:基于 mxGraph 与 WebSocket 的动态流程图构建

本文将详细介绍如何在 Vue3 项目中集成 mxGraph 可视化库&#xff0c;并通过 WebSocket 实现画布元素的实时更新。适合有 Vue 基础的前端开发者学习参考。 一、技术栈准备 Vue3&#xff1a;采用 Composition API 开发mxGraph&#xff1a;JavaScript 流程图库&#xff08;版本 …...

Python-金融相关代码讲解

文章目录 概要整体架构流程1.代码部分2.逐个讲解1&#xff09;# -*- coding: utf-8 -*-2&#xff09;基本库引入3&#xff09;函数模块4&#xff09;主程序 小结1. 问题拆解思维2. 文件处理三件套3. 字典的妙用&#xff1a;4. 上下文管理器&#xff08;with open...&#xff09…...

深度解读DeepSeek:开源周(Open Source Week)技术解读

深度解读DeepSeek&#xff1a;开源周&#xff08;Open Source Week&#xff09;技术解读 深度解读DeepSeek&#xff1a;源码解读 DeepSeek-V3 深度解读DeepSeek&#xff1a;技术原理 深度解读DeepSeek&#xff1a;发展历程 文章目录 一、开源内容概览Day1&#xff1a;FlashMLAD…...

【算法】十大排序算法(含时间复杂度、核心思想)

以下是 **十大经典排序算法** 的时间复杂度、空间复杂度及稳定性总结&#xff0c;适用于面试快速回顾&#xff1a;排序算法对比表 排序算法最佳时间复杂度平均时间复杂度最差时间复杂度空间复杂度稳定性核心思想冒泡排序O(n)O(n)O(n)O(1)稳定相邻元素交换&#xff0c;大数沉底…...

TCP传输---计算机网络

TCP结构 源端口和目标端口&#xff1a;标识通信的应用程序。序列号&#xff1a;标记发送的数据段的顺序序号。确认号 ( ACK)&#xff1a;确认接收到的数据序号。标志位&#xff1a;控制连接状态&#xff0c;包括 SYN&#xff08;同步&#xff09;、ACK&#xff08;确认&#xf…...

创建vue2项目

1、前往 Node.js 官网下载并安装 Node.js&#xff0c;安装完成后&#xff0c;npm 会随之安装。确认 Node.js 和 npm 是否成功安装&#xff0c;可以在命令行中运行以下命令检查版本&#xff1a; node -v npm -v 运行结果&#xff1a;&#xff08;如下&#xff0c;表示node和n…...

从投机到可持续发展:ETHDenver 2025 的关键启示!

ETHDenver 2025 重点讨论了 Web3 向可持续发展转型&#xff0c;特别强调了人才培养、去中心化治理和激励机制的紧密结合。Polkadot 一直以来的长期观点也进一步支持了行业从投机转向长期、社区驱动增长的趋势。随着 ETHDenver 2025 会议的的落幕&#xff0c;Polkadot 生态中的贡…...

WPS宏开发手册——使用、工程、模块介绍

目录 系列文章前言1、开始1.1、宏编辑器使用步骤1.2、工程1.3、工程 系列文章 使用、工程、模块介绍 JSA语法 第三篇练习练习题&#xff0c;持续更新中… 前言 如果你是开发人员&#xff0c;那么wps宏开发对你来说手拿把切。反之还挺吃力&#xff0c;需要嘻嘻&#xf…...

操作系统为ubantu的服务器上部署nginx软件基础步骤总结

今天在这里&#xff0c;我们总结一下ubantu的服务器上部署nginx软件&#xff0c;请按照以下步骤进行安装&#xff1a; 1、更新包列表&#xff1a; 首先更新你系统中的可用软件包列表&#xff0c;以确保你可以安装最新版本。 sudo apt update2、 Ubuntu上更新已安装软件包&…...