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

B081-Lucene+ElasticSearch

目录

      • 认识全文检索
        • 概念
        • lucene原理
        • 全文检索的特点
        • 常见的全文检索方案
      • Lucene
        • 创建索引
          • 导包
          • 分析图
          • 代码
        • 搜索索引
          • 分析图
          • 代码
      • ElasticSearch
        • 认识ElasticSearch
        • ES与Kibana的安装及使用说明
        • ES相关概念理解和简单增删改查
        • ES查询
          • DSL查询
          • DSL过滤
        • 分词器
          • IK分词器
            • 安装
            • 测试分词器
          • 文档映射(字段类型设置)
            • ES字段类型
            • 默认映射
            • kibana
        • Java操作ES
          • 导入依赖
          • crud实现

认识全文检索

概念

对非结构化数据的搜索就叫全文检索,狭义的理解主要针对文本数据的搜索。

非结构化数据:
没有固定模式的数据,如WORD、PDF、PPT、EXL,各种格式的图片、视频等。
非结构化数据是数据结构不规则或不完整,没有预定义的数据模型,不方便用数据库二维逻辑表来表现的数据。包括所有格式的办公文档、文本、图片、XML, HTML、各类报表、图像和音频/视频信息等等

理解:可以理解为全文检索就是把没有结构化的数据变成有结构的数据,然后进行搜索,因为有结构化的数据通常情况下可以按照某种算法进行搜索。

lucene原理

在这里插入图片描述
在这里插入图片描述

全文检索的特点

相关度最高的排在最前面,官网中相关的网页排在最前面; java
关键词的高亮。
只处理文本,不处理语义。 以单词方式进行搜索
比如在输入框中输入“中国的首都在哪里”,搜索引擎不会以对话的形式告诉你“在北京”,而仅仅是列出包含了搜索关键字的网页。

常见的全文检索方案

全文搜索工具包-Lucene(核心)
全文搜索服务器 ,Elastic Search(ES) / Solr等封装了lucene并扩展

Lucene

创建索引

导包
<dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-core</artifactId><version>5.5.0</version>
</dependency>
<dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-analyzers-common</artifactId><version>5.5.0</version>
</dependency>
<dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-queryparser</artifactId><version>5.5.0</version>
</dependency>
分析图

在这里插入图片描述

代码
    //创建索引@Testpublic void testCreateIndex() throws Exception {// 准备原始数据String doc1 = "hello world";int id1 = 1;String doc2 = "hello java world";int id2 = 2;String doc3 = "lucene world";int id3 = 3;//把数据变成Document对象Document d1 = new Document();d1.add(new TextField("context",doc1, Field.Store.YES));// 存储列的名字;存储的数据;是否要存储原始数据d1.add(new IntField("id", id1, Field.Store.YES));Document d2 = new Document();d2.add(new TextField("context",doc2, Field.Store.YES));d2.add(new IntField("id", id2, Field.Store.YES));Document d3 = new Document();d3.add(new TextField("context",doc3, Field.Store.YES));d3.add(new IntField("id", id3, Field.Store.YES));//准备索引库路径Directory directory = new SimpleFSDirectory(Paths.get("D:/(课件 Xmind 图 代码) (总结) (原理)(题目) (预习)/081-Lucene+ElasticSearch/code/lucene-demo/index"));Analyzer analyzer = new SimpleAnalyzer();//配置信息,添加分词器IndexWriterConfig conf = new IndexWriterConfig(analyzer);//创建IndexWriter,创建索引IndexWriter indexWriter = new IndexWriter(directory,conf);//使用IndexWriter创建索引indexWriter.addDocument(d1);indexWriter.addDocument(d2);indexWriter.addDocument(d3);//提交创建indexWriter.commit();indexWriter.close();System.out.println("创建索引完成.......");}

搜索索引

分析图

在这里插入图片描述

代码
    //搜索索引@Testpublic void testSearchIndex() throws Exception {//索引库路径Directory directory = new SimpleFSDirectory(Paths.get("D:/(课件 Xmind 图 代码) (总结) (原理)(题目) (预习)/081-Lucene+ElasticSearch/code/lucene-demo/index"));IndexReader indexReader = DirectoryReader.open(directory);//创建indexSearch 搜索索引IndexSearcher indexSearcher = new IndexSearcher(indexReader);//Term(String fld, String text) 要查询哪个字段,查询什么内容TermQuery query = new TermQuery(new Term("context", "hello"));//query:查询的条件   n:查多少条TopDocs topDocs = indexSearcher.search(query, 10);System.out.println("命中的条数:"+topDocs.totalHits);//列表结果,带有分数ScoreDoc[] scoreDocs = topDocs.scoreDocs;for (ScoreDoc scoreDoc : scoreDocs) {//文档分数float score = scoreDoc.score;//文档idint docID = scoreDoc.doc;//根据id获取文档Document doc = indexSearcher.doc(docID);System.out.println("id = "+doc.get("id")+" , score = "+score+" ,context = "+doc.get("context"));}}

ElasticSearch

认识ElasticSearch

见文档

ES与Kibana的安装及使用说明

见文档
Kibana可视化管理工具,相当于navicat,

ES相关概念理解和简单增删改查

在这里插入图片描述

#  添加数据       ---用户自己维护文档id
PUT pethome/user/5
{"id":5, "name": "wenda", "age":20,"size":170, "sex":1
}#  添加数据       ---ES自动维护文档id AYpOuIdMNmSVfcreiYqz
POST pethome/user/
{"id":2, "name": "wenda", "age":20,"size":170, "sex":1
}# 查询单条
GET pethome/user/1
GET pethome/user/AYpOuIdMNmSVfcreiYqz# 修改 全量修改
PUT pethome/user/1
{"id":1, "name": "wendaxi", "age":21,"sex":0
}# 修改  局部
POST pethome/user/1/_update
{"doc":{"name": "wenda", "age":24}
}#  删除
DELETE pethome/user/AYpOuIdMNmSVfcreiYqz#  获取多个数据结果
GET pethome/user/_mget
{"ids":[1,"AYpOuIdMNmSVfcreiYqz"]
}#  空搜索
GET _search#  分页
GET pethome/user/_search?size=2&from=2#  带条件分页
GET pethome/user/_search?q=age:20&size=2&from=2

ES查询

DSL查询

由ES提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。
DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现

# 查询名字叫做wenda,size在160-180之间,sex为1,
# 按照id升序排序 查询第一页 的数据 每页3条# 排序分页
GET pethome/user/_search
{"size": 3,"from": 0,"sort": [{"id": {"order": "asc"}}]
}#  加入查询条件
#  match 相当于模糊查询(分词查询)
GET pethome/user/_search
{"query": {"match": {"name": "wenda"}}, "size": 3,"from": 0,"sort": [{"id": {"order": "asc"}}]
}
DSL过滤

DSL过滤 查询文档的方式更像是对于我的条件“有”或者“没有”,–精确查询
而DSL查询语句则像是“有多像”。–类似于模糊查询

DSL过滤和DSL查询在性能上的区别 :
过滤结果可以缓存并应用到后续请求。
查询语句同时 匹配文档,计算相关性,所以更耗时,且不缓存。
过滤语句 可有效地配合查询语句完成文档过滤。

# 工作中少用like全表扫描,会让索引失效
# where name like '%y%' and age=18 
# where age=18 and name like "%y%" (快)
# 先精确匹配 把结果缓存用于后续的查询
# DSL过滤-------相当于精确查找
GET pethome/user/_search
{"query": {"bool": {"must": [{"match": {"name": "wenda"}}],"filter": [{"term": {"age": "20"}},{"range": {"size": {"gte": 160,"lte": 170}}}]}}, "size": 2,"from": 0,"sort": [{"id": {"order": "asc"}}]
}

分词器

单字,双字,庖丁,IK

IK分词器
安装

先关闭ES与Kibana,然后解压elasticsearch-analysis-ik-5.2.2.zip文件,并将其内容放置于ES根目录/plugins/ik

测试分词器
POST _analyze
{"analyzer":"ik_smart","text":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"
}
文档映射(字段类型设置)

ES的文档映射(mapping)机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型。

ES字段类型
① 基本字段类型
字符串:text(分词),keyword(不分词)   StringField(不分词文本),TextFiled(要分词文本)text默认为全文文本,keyword默认为非全文文本
数字:long,integer,short,double,float
日期:date
逻辑:boolean
{user:{“key”:value}}
{hobbys:[xxx,xx]}
② 复杂数据类型
对象类型:object
数组类型:array
地理位置:geo_point,geo_shape
默认映射

查看索引类型的映射配置:GET {indexName}/_mapping/{typeName}
ES在没有配置Mapping的情况下新增文档,ES会尝试对字段类型进行猜测,并动态生成字段和类型的映射关系。
在这里插入图片描述

kibana
GET pethome/user/_mappingPOST pethome/employee2/_mapping
{"employee2": {"properties": {"id": {"type": "long"},"username": {"type": "text","analyzer": "ik_smart","search_analyzer": "ik_smart"},"password": {"type": "keyword"}}}
}GET pethome/employee2/_mapping

Java操作ES

导入依赖
	<dependency><groupId>org.elasticsearch.client</groupId><artifactId>transport</artifactId><version>5.2.2</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.7</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.7</version></dependency>
crud实现
import org.elasticsearch.action.delete.DeleteRequestBuilder;
import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequestBuilder;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Test;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map;public class ESTestNew {//创建ES的客户端对象public static TransportClient getClient(){TransportClient client = null;try {client = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));} catch (UnknownHostException e) {e.printStackTrace();}return client;}@Testpublic void testAddIndex(){TransportClient client = getClient();for (int i = 0; i < 50; i++) {IndexRequestBuilder builder = client.prepareIndex("pethome", "wxuser", String.valueOf(i));Map<String, Object> map = new HashMap<>();// 添加数据map.put("id",i);map.put("name","玛利亚"+i);map.put("age",18+i);map.put("sex",i%2);map.put("size",150+i);map.put("intro","haha"+i);builder.setSource(map);// 执行创建builder.get();}// 关闭资源client.close();}@Testpublic void testUpdate(){TransportClient client = getClient();// 指定要执行的操作对象UpdateRequestBuilder builder = client.prepareUpdate("pethome", "wxuser", String.valueOf(0));Map<String, Object> map = new HashMap<>();map.put("id",0);map.put("name","玛利亚000");map.put("age",18);map.put("sex",0);map.put("size",155);map.put("intro","haha000");builder.setDoc(map).get();client.close();}@Testpublic void testDel(){TransportClient client = getClient();DeleteRequestBuilder builder = client.prepareDelete("pethome", "wxuser", String.valueOf(0));builder.get();client.close();}@Testpublic void testQuery(){TransportClient client = getClient();SearchRequestBuilder builder = client.prepareSearch("pethome");builder.setTypes("wxuser");// 指定查询那个文件类型builder.setFrom(0);//起始位置builder.setSize(5);//每页条数builder.addSort("id", SortOrder.ASC);//设置排序// 添加筛选条件BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();boolQuery.must(QueryBuilders.matchQuery("name","玛利亚"));boolQuery.filter(QueryBuilders.termQuery("sex",1));boolQuery.filter(QueryBuilders.rangeQuery("size").gte(150).lte(180));SearchResponse response = builder.setQuery(boolQuery).get();SearchHits hits = response.getHits();System.out.println(hits.getTotalHits());SearchHit[] searchHits = hits.getHits();for (SearchHit searchHit : searchHits) {System.out.println(searchHit.getSource());}client.close();}
}

相关文章:

B081-Lucene+ElasticSearch

目录 认识全文检索概念lucene原理全文检索的特点常见的全文检索方案 Lucene创建索引导包分析图代码 搜索索引分析图代码 ElasticSearch认识ElasticSearchES与Kibana的安装及使用说明ES相关概念理解和简单增删改查ES查询DSL查询DSL过滤 分词器IK分词器安装测试分词器 文档映射(字…...

机器学习:塑造未来的核心力量

着科技的飞速发展&#xff0c;机器学习已经成为我们生活中不可或缺的一部分。无论是搜索引擎、推荐系统&#xff0c;还是自动驾驶汽车和机器人&#xff0c;都依赖于机器学习算法。本文将探讨机器学习的基本概念、应用领域以及未来发展趋势。 一、机器学习的基本概念 机器学习…...

RK3568-i2c-适配8010rtc时钟芯片

硬件连接 从硬件原理图中可以看出&#xff0c;rtc时钟芯片挂载在i2c3总线上&#xff0c;设备地址需要查看芯片数据手册。编写设备树 &i2c3 {status "okay";rx8010: rx801032 {compatible "epson,rx8010";reg <0x32>;}; };使能驱动 /kernel/…...

Spring Security - 基于内存快速demo

基于内存方式 - 只作学习参考1.引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>2.login.html、index.html、fail.htmllogin.html:<form method…...

6 | 从文本文件中读取单词并输出不重复的单词列表

Transformation 操作 Transformation 操作是用于从一个 RDD(Resilient Distributed Dataset)创建一个新的 RDD,通常是通过对原始 RDD 的元素进行映射、筛选、分组等操作来实现的。Transformation 操作不会立即执行,而是惰性计算,只有在 Action 操作触发时才会真正执行。以…...

【微信小程序篇】- 多环境(版本)配置

最近自己在尝试使用AIGC写一个小程序&#xff0c;页面、样式、包括交互函数AIGC都能够帮我完成(不过这里有一点问题AIGC的上下文关联性还是有限制&#xff0c;会经常出现对于需求理解跑偏情况&#xff0c;需要不断的重复强调&#xff0c;并纠正错误&#xff0c;才能得到你想要的…...

ssh配置(一、GitLabGitHub)

一. 为什么配置ssh 使用 ssh 克隆项目&#xff0c;更加安全方便。 git clone 项目时一般使用两种协议 https 和 ssh 。 二. 原理的通俗解释 ssh 解决的问题是登录时的用户身份验证问题&#xff0c;默认使用 RSA&#xff08;也支持其他算法&#xff1a; RSA、DSA、ECDSA、EdD…...

开了抖店后就可以直播带货了吗?想在抖音带货的,建议认真看完!

我是王路飞。 关于抖店和直播带货的关系&#xff0c;其实很多人经常搞不清楚。 不然的话&#xff0c;也不会有这个问题的出现了&#xff1a;开了抖店后就可以直播带货了吗&#xff1f; 在我看来&#xff0c;这个问题很简单&#xff0c;但在不了解抖音电商和直播带货其中门道…...

【深度学习实验】数据可视化

目录 一、实验介绍 二、实验环境 三、实验内容 0. 导入库 1. 归一化处理 归一化 实验内容 2. 绘制归一化数据折线图 报错 解决 3. 计算移动平均值SMA 移动平均值 实验内容 4. 绘制移动平均值折线图 5 .同时绘制两图 6. array转换为tensor张量 7. 打印张量 一、…...

【Golang】函数篇

1、golang函数基本定义与使用 func 函数名 (形参列表) (返回值类型列表) {函数体return 返回值列表 }其中func用于表明这是一个函数&#xff0c;剩下的东西与其他语言的函数基本一致&#xff0c;在定义与使用的时候注意函数名、参数、返回值书写的位置即可。下面使用一个例子…...

在ubuntu上安装ns2和nam(ubuntu16.04)

在ubuntu上安装ns2和nam 版本选择安装ns2安装nam 版本选择 首先&#xff0c;版本的合理选择可以让我们避免很多麻烦 经过测试&#xff0c;ubuntu的版本选择为ubuntu16.04&#xff0c;ns2的版本选择为ns-2.35&#xff0c;nam包含于ns2 资源链接(百度网盘) 链接:https://pan.bai…...

SpringCloudAlibaba之Sentinel介绍

文章目录 1 Sentinel1.1 Sentinel简介1.2 核心概念1.2.1 资源1.2.2 规则 1.3 入门Demo1.3.1 引入依赖1.3.2 集成Spring1.3.3 Spring中资源规则 1.4 Sentinel控制台1.5 核心原理1.5.1 NodeSelectorSlot1.5.2 ClusterBuilderSlot1.5.3 LogSlot1.5.4 StatisticSlot1.5.5 Authority…...

苹果微信聊天记录删除了怎么恢复?果粉原来是这样恢复的

粗心大意删除了微信聊天记录&#xff1f;有时候&#xff0c;一些小伙伴可能只是想要删除一部分聊天记录&#xff0c;但是在进行批量删除时&#xff0c;不小心勾选到了很重要的对话&#xff0c;从而导致记录丢失。 如果这时想找回聊天记录该怎么办&#xff1f;微信聊天记录删除…...

JVM的故事——虚拟机字节码执行引擎

虚拟机字节码执行引擎 文章目录 虚拟机字节码执行引擎一、概述二、运行时栈帧结构三、方法调用 一、概述 执行引擎Java虚拟机的核心组成之一&#xff0c;它是由软件自行实现的&#xff0c;能够执行那些不被硬件直接支持的指令集格式。 对于不同的虚拟机实现&#xff0c;执行引…...

设计模式之适配器与装饰器

目录 适配器模式 简介 角色 使用 优缺点 使用场景 装饰器模式 简介 优缺点 模式结构 使用 使用场景 适配器模式 简介 允许将不兼容的对象包装成一个适配器类&#xff0c;使得其他类可以通过适配器类与原始对象进行交互&#xff0c;从而提高兼容性 角色 目标角色…...

服务器数据恢复- Ext4文件系统分区挂载报错的数据恢复案例

Ext4文件系统相关概念&#xff1a; 块组&#xff1a;Ext4文件系统的空间被划分为若干个块组&#xff0c;每个块组内的结构大致相同。 块组描述符表&#xff1a;每个块组都对应一个块组描述符&#xff0c;这些块组描述符统一放在文件系统的前部&#xff0c;称为块组描述符表。每…...

19-springcloud(上)

一 微服务架构进化论 单体应用阶段 (夫妻摊位) 在互联网发展的初期&#xff0c;用户数量少&#xff0c;一般网站的流量也很少&#xff0c;但硬件成本较高。因此&#xff0c;一般的企业会将所有的功能都集成在一起开发一个单体应用&#xff0c;然后将该单体应用部署到一台服务器…...

前端基础---HTML笔记汇总一

HTML定义 HTML超文本标记语言——HyperText Markup Language。 超文本是什么&#xff1f; 链接标记是什么&#xff1f; 标记也叫标签&#xff0c;带尖括号的文本 标签分类 单标签:只有开始标签&#xff0c;没有结束标签(<br>换行 <hr>水平线 <img> 图像标…...

智汇云舟亮相中国安防工程商集成商大会

智汇云舟亮相中国安防工程商集成商大会&#xff0c;以视频孪生驱动安防行业数字化转型 近日&#xff0c;由中国安全防范产品行业协会指导&#xff0c;永泰传媒主办的中国安防工程商&#xff08;系统集成商&#xff09;大会暨第69届中国安防新产品、新技术成果展示在石家庄圆满…...

使用 Sealos 在离线环境中光速安装 K8s 集群

作者&#xff1a;尹珉。Sealos 开源社区 Ambassador&#xff0c;云原生爱好者。 当容器化交付遇上离线环境 在当今快节奏的软件交付环境中&#xff0c;容器化交付已经成为许多企业选择的首选技术手段。在可以访问公网的环境下&#xff0c;容器化交付不仅能够提高软件开发和交付…...

告别手动测量!用ArcGIS+CAD搞定河道平均宽度的两种实用方法(附详细步骤)

河道平均宽度计算实战&#xff1a;ArcGIS与CAD高效协同方案解析 河道宽度测量是水文分析、防洪规划与生态评估中的基础工作&#xff0c;但传统手工测量方式在面对复杂河道形态时往往效率低下。本文将深入解析两种基于ArcGIS与CAD协同的自动化计算方法&#xff0c;通过技术组合实…...

不用Remix在线版!在VSCode里用Hardhat写合约,搭配Ganache和MetaMask本地测试全流程

在VSCode中构建专业级以太坊开发环境&#xff1a;HardhatGanacheMetaMask全流程指南 对于追求高效开发的以太坊工程师而言&#xff0c;脱离浏览器限制、建立本地化开发工作流已成为专业化的标志。本文将带你用VSCodeHardhat打造企业级智能合约开发环境&#xff0c;结合Ganache私…...

Perplexity移动端体验崩塌实录:iOS/Android双平台1372条崩溃日志聚类分析,含Google Play App Store差评时间戳热力图

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Perplexity用户评论汇总 Perplexity AI 作为一款以“引用驱动”为特色的问答式搜索引擎&#xff0c;自上线以来持续吸引学术研究者、开发者与技术爱好者群体。其用户评论呈现高度两极化特征&#xff1a;一方面…...

TPFanCtrl2:ThinkPad笔记本风扇控制的终极自定义方案

TPFanCtrl2&#xff1a;ThinkPad笔记本风扇控制的终极自定义方案 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 对于ThinkPad用户而言&#xff0c;原厂的风扇控制策略…...

从CVE-2017-11882到CVE-2018-0802:一个Office漏洞的“补丁绕过”实战复现与调试分析

从CVE-2017-11882到CVE-2018-0802&#xff1a;Office漏洞补丁绕过的深度解析与实战复现 漏洞背景与历史沿革 2017年11月&#xff0c;微软修补了一个存在近20年的Office公式编辑器组件漏洞&#xff08;CVE-2017-11882&#xff09;&#xff0c;该漏洞允许攻击者通过特制的RTF文档…...

Pixelle-Video全球化架构:智能AI短视频引擎的多语言解决方案

Pixelle-Video全球化架构&#xff1a;智能AI短视频引擎的多语言解决方案 【免费下载链接】Pixelle-Video &#x1f680; AI 全自动短视频引擎 | AI Fully Automated Short Video Engine 项目地址: https://gitcode.com/GitHub_Trending/pi/Pixelle-Video Pixelle-Video作…...

内存计算芯片技术:相变存储器与混合信号架构解析

1. 内存计算芯片技术概述内存计算&#xff08;In-Memory Computing&#xff09;技术正在重塑现代计算架构的格局。传统冯诺依曼架构中&#xff0c;数据需要在处理器和存储器之间频繁搬运&#xff0c;这种"存储墙"问题已成为制约计算效率的主要瓶颈。根据IEEE的实测数…...

大模型微调实战:用LoRA技术微调LLaMA 2模型

在人工智能技术飞速发展的当下&#xff0c;大语言模型&#xff08;LLM&#xff09;在自然语言处理领域展现出了强大的能力。LLaMA 2作为Meta推出的开源大模型&#xff0c;凭借其出色的性能和广泛的适用性&#xff0c;成为了众多开发者和研究人员的首选。对于软件测试从业者而言…...

从Ubuntu 16.04到自定义Rootfs:Firefly-RK3399系统镜像DIY全记录

从Ubuntu 16.04到自定义Rootfs&#xff1a;Firefly-RK3399系统镜像DIY全记录 在嵌入式开发领域&#xff0c;Firefly-RK3399凭借其强大的六核ARM架构和丰富的扩展接口&#xff0c;成为众多开发者的首选平台。然而&#xff0c;官方提供的Ubuntu 16.04镜像往往无法满足特定项目需求…...

本地Perplexity服务突然中断?:排查systemd服务崩溃、GPU显存溢出与模型权重校验失败的5分钟应急清单

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Perplexity本地服务查询 Perplexity 作为一款强调实时信息溯源与多源验证的 AI 助手&#xff0c;其官方未提供公开的本地化部署方案。但开发者可通过构建轻量级本地代理服务&#xff0c;模拟 Perplexity 的查…...