【后端高階面經:架構篇】51、搜索引擎架構與排序算法:面試關鍵知識點全解析

在這里插入圖片描述

一、搜索引擎核心基石:倒排索引技術深度解析

(一)倒排索引的本質與構建流程

倒排索引(Inverted Index)是搜索引擎實現快速檢索的核心數據結構,與傳統數據庫的正向索引(文檔→關鍵詞)不同,它通過關鍵詞→文檔集合的映射關系,將查詢復雜度從O(N)降至O(1)。其構建流程如下:

1. 數據預處理:從原始文本到詞元(Lexeme)
  • 中文分詞挑戰:需解決分詞歧義(如“乒乓球拍賣完了”可拆分為“乒乓球/拍賣/完了”或“乒乓球拍/賣/完了”)。
    解決方案:使用IK分詞器結合自定義詞典(如電商領域詞庫),或基于深度學習的分詞模型(如LSTM+CRF)。
  • 詞元處理
    • 小寫轉換(統一大小寫)
    • 停用詞過濾(去除“的”“了”等無意義詞匯)
    • 詞干提取(如將“running”轉換為“run”)
2. 倒排表構建:從詞元到文檔列表
graph TDA[詞元] --> B{倒排表}B --> C[文檔ID列表]C --> D[詞頻(TF)]C --> E[位置信息]
  • 示例
    文檔1:“搜索引擎是用于檢索海量數據的工具”
    文檔2:“Elasticsearch是分布式搜索引擎”
    倒排索引如下:
    搜索引擎: [1,2] (TF: 1 in doc1, 1 in doc2)  
    檢索: [1] (TF: 1)  
    Elasticsearch: [2] (TF: 1)  
    
3. 壓縮與優化:提升存儲與查詢效率
  • 差值編碼(Delta Encoding):存儲文檔ID差值而非絕對值(如文檔ID列表[100, 200, 300]→[100, 100, 100]),減少存儲空間。
  • 位圖壓縮(Bitmap Compression):用位運算快速實現布爾查詢(如“搜索引擎 AND 分布式”等價于兩詞倒排表的位圖交集)。
  • 基于Lucene的實現
    // Lucene倒排索引構建偽代碼
    Directory directory = FSDirectory.open(Paths.get("index"));
    Analyzer analyzer = new StandardAnalyzer();
    IndexWriterConfig config = new IndexWriterConfig(analyzer);
    IndexWriter writer = new IndexWriter(directory, config);Document doc = new Document();
    doc.add(new TextField("content", "搜索引擎是用于檢索海量數據的工具", Field.Store.YES));
    writer.addDocument(doc);
    writer.close();
    

(二)倒排索引 vs 正向索引:核心差異對比

維度正向索引倒排索引
數據結構文檔→關鍵詞列表關鍵詞→文檔列表
查詢復雜度O(N)(遍歷所有文檔)O(1)(直接定位關鍵詞)
適用場景數據庫行級查詢全文檢索、模糊查詢
典型實現MySQL InnoDB B+樹Elasticsearch Lucene

二、分布式搜索引擎架構:應對PB級數據的關鍵

(一)分片(Shard)與副本(Replica)機制

1. 分片:將數據“分而治之”
  • 水平拆分策略
    • 哈希分片:按文檔ID哈希值分配至不同節點(如doc_id % shard_num),適合均勻分布的數據。
    • 范圍分片:按時間范圍(如按月存儲日志)或數值范圍(如用戶年齡分段)劃分,適合時序數據。
  • Elasticsearch示例
    # ES索引分片配置
    settings:number_of_shards: 5   # 主分片數(建議≤節點數)number_of_replicas: 1 # 副本數(提升查詢吞吐量)
    
2. 副本:高可用與負載均衡
  • 主副本機制:每個主分片對應多個副本分片,主分片負責寫入,副本分片分擔讀請求。
  • 故障切換:當主分片所在節點故障時,副本分片自動升級為主分片(通過ES的Master節點協調)。
  • 性能提升:1個主分片+2個副本可將讀吞吐量提升3倍(假設各節點性能一致)。

(二)分布式查詢流程:從請求到結果的全鏈路

graph LR用戶-->ES集群: 查詢請求(如“分布式搜索引擎”)ES協調節點-->分片1: 檢索關鍵詞“分布式”ES協調節點-->分片2: 檢索關鍵詞“搜索引擎”分片1-->協調節點: 返回文檔列表1(含詞頻、評分)分片2-->協調節點: 返回文檔列表2(含詞頻、評分)協調節點-->合并結果: 按相關性排序后返回用戶
  • 查詢階段(Query Phase):各分片返回匹配文檔的ID和評分(TF-IDF或BM25算法)。
  • 取回階段(Fetch Phase):協調節點根據文檔ID從各分片獲取完整文檔內容。

(三)與傳統數據庫的性能對比

場景MySQL(單節點)Elasticsearch(5節點集群)
百億級數據模糊查詢超時(>30秒)200ms
復雜布爾查詢(AND/OR)全表掃描,效率低下位運算快速合并結果
水平擴展能力需分庫分表,復雜度高自動分片,線性擴展

三、近實時檢索與數據同步:平衡實時性與性能

(一)準實時索引技術

1. Elasticsearch的段(Segment)機制
  • 寫入流程
    1. 新數據先寫入內存緩沖區(In-Memory Buffer)。
    2. 每隔1秒(默認Refresh間隔)生成新段(Segment)并寫入磁盤,此時數據可被檢索(準實時)。
    3. 定期合并小段為大段(Force Merge),減少I/O開銷。
  • 性能 trade-off:縮短Refresh間隔可提升實時性,但增加磁盤I/O和段數量(建議生產環境設為5-10秒)。
2. 增量數據同步方案
數據源同步工具典型場景
MySQLCanal + Kafka + Logstash電商商品信息同步
日志文件Fluentd + ES Client實時日志分析
分布式事務Apache RocketMQ + 事務消息訂單狀態變更通知

(二)數據同步中間層設計

MySQL Canal Kafka Logstash Elasticsearch Binlog增量數據 發送變更事件 消費事件 寫入索引 MySQL Canal Kafka Logstash Elasticsearch
  • Canal原理:模擬MySQL從庫讀取Binlog,解析數據變更(如INSERT/UPDATE/DELETE)。
  • 冪等性保證:通過消息唯一ID(如UUID)避免重復寫入(ES支持按ID冪等更新)。

四、混合檢索架構:從關鍵詞到語義向量的跨越

(一)向量數據庫與語義檢索

1. 非結構化數據向量化
  • 技術棧
    • 圖像:ResNet50提取特征→768維向量
    • 文本:BERT編碼→1024維向量
    • 視頻:3D卷積神經網絡(如C3D)提取時空特征
  • Milvus向量索引示例
    # Milvus創建HNSW索引
    from pymilvus import Collection, IndexTypecollection = Collection("product_images")
    index_params = {"index_type": IndexType.HNSW, "metric_type": "L2", "params": {"M": 64, "efConstruction": 512}}
    collection.create_index("embedding", index_params)
    
2. 混合搜索(Hybrid Search)實現
graph TB用戶查詢-->解析器: 提取關鍵詞(如“紅色運動鞋”)解析器-->結構化查詢: 品牌=耐克 AND 顏色=紅色解析器-->向量查詢: 運動鞋圖片向量相似度檢索結果合并器-->ES: 執行結構化過濾結果合并器-->Milvus: 執行向量匹配結果合并器-->排序: 綜合得分(關鍵詞匹配度+向量相似度)
  • 應用案例:電商“以圖搜物”場景中,用戶上傳圖片→提取向量→Milvus檢索相似商品→ES過濾品牌/價格等條件→按綜合得分排序。

(二)GPU加速與性能優化

技術方案加速場景效率提升
GPU向量檢索Milvus HNSW索引查詢10億向量檢索從200ms→20ms
向量化計算TF-IDF權重計算單核CPU→GPU加速5-10倍
并行分詞中文分詞(如Jieba多線程)處理速度提升4倍

五、搜索結果排序:從算法到工程的全鏈路優化

(一)經典排序算法解析

1. PageRank:鏈接分析的核心
  • 原理:將網頁視為圖節點,超鏈接視為投票,網頁權重由入鏈數量和質量決定。
    公式
    P R ( A ) = ( 1 ? d ) + d × ∑ i = 1 n P R ( T i ) C ( T i ) PR(A) = (1-d) + d \times \sum_{i=1}^n \frac{PR(T_i)}{C(T_i)} PR(A)=(1?d)+d×i=1n?C(Ti?)PR(Ti?)?
    其中,d為阻尼系數(通常取0.85),T_i為指向A的網頁,C(T_i)為T_i的出鏈數。
  • 工程實現
    • 分布式計算:MapReduce批量處理網頁鏈接關系。
    • 增量更新:僅重新計算變更網頁的權重,而非全量重新計算。
2. TF-IDF與BM25:文本相關性排序
  • TF-IDF:詞頻(TF)越高、文檔頻率(DF)越低,關鍵詞權重越高。
    公式
    T F ? I D F = T F × log ? ( N D F + 1 ) TF-IDF = TF \times \log(\frac{N}{DF+1}) TF?IDF=TF×log(DF+1N?)
  • BM25:改進版TF-IDF,引入文檔長度歸一化。
    公式
    B M 25 = ∑ ( k + 1 ) × T F T F + k × ( 1 ? b + b × l e n ( d ) a v g l e n ) BM25 = \sum \frac{(k+1) \times TF}{TF + k \times (1 - b + b \times \frac{len(d)}{avg_len})} BM25=TF+k×(1?b+b×avgl?enlen(d)?)(k+1)×TF?
    (k、b為可調參數,通常k=1.2,b=0.75)
3. 業務場景定制排序
  • UGC平臺(如小紅書):點贊數(社交權重)+ 詞頻(內容相關性)+ 發布時間(新鮮度)。
  • 電商搜索(如淘寶):銷量(商業權重)+ 價格(用戶偏好)+ BM25(關鍵詞匹配)。

(二)排序算法對比與選型

算法優勢劣勢適用場景
PageRank全局權威性評估實時性差,依賴鏈接結構網頁搜索(如Google)
TF-IDF/BM25文本相關性精準計算忽略語義,無法處理多模態垂直領域文本搜索
向量排序語義級匹配,支持多模態計算復雜度高圖片/視頻搜索
機器學習排序(如LambdaMART)綜合多特征,動態調參需要大量標注數據個性化搜索(如電商)

六、性能優化與容災設計:保障高可用與低延遲

(一)索引與硬件優化

1. 索引策略選擇
數據集大小索引類型檢索延遲存儲成本
<100萬向量FLAT(精確索引)10ms100%
100萬-1億向量IVF_PQ(乘積量化)50ms30%-50%
>1億向量HNSW(層次化導航)20ms60%-70%
2. 硬件加速方案
  • 存儲層:SSD替換HDD(隨機讀IOPS從100→5000+)。
  • 網絡層:RDMA網絡(RoCEv2)降低節點間通信延遲(從100μs→20μs)。
  • 計算層:Intel Optane持久內存(延遲10μs,容量達TB級)緩存熱數據。

(二)容災與監控體系

1. 高可用架構設計
  • 多數據中心(Multi-DC)
    • 主數據中心(如北京)與災備中心(如上海)通過異步復制同步數據。
    • 故障切換:通過Keepalived+DNS動態切換訪問入口。
  • Raft協議應用:ES的Master節點選舉機制確保集群一致性(需至少3個節點形成多數派)。
2. 實時監控指標
指標健康閾值優化動作
分片延遲<50ms遷移分片至空閑節點
內存使用率<80%增加節點或淘汰冷數據
搜索超時率<1%優化查詢語句或增加副本
段數量<1000/索引執行Force Merge

七、面試高頻問題與解答

(一)基礎概念題

問題1:倒排索引為什么比正向索引更適合全文檢索?
回答

  • 正向索引按文檔存儲關鍵詞,查詢時需遍歷所有文檔,時間復雜度O(N)。
  • 倒排索引按關鍵詞存儲文檔列表,查詢時直接定位關鍵詞對應的文檔集合,時間復雜度O(1),且通過壓縮技術進一步提升效率。

問題2:Elasticsearch的分片和副本有什么區別?
回答

  • 分片(Shard):數據水平拆分的最小單元,解決單機存儲和計算瓶頸。
  • 副本(Replica):分片的復制版本,用于高可用(主分片故障時自動切換)和負載均衡(分擔讀請求)。
  • 示例:5主分片+1副本=10個分片(5主+5副),可承受5個節點故障(每個主分片至少有1個副本)。

(二)架構設計題

問題:如何設計一個支持億級商品的電商搜索系統?
解答

  1. 數據分層
    • 熱數據(近30天商品):Redis緩存高頻查詢結果。
    • 溫數據(30天-1年商品):Elasticsearch集群(10主分片+2副本,SSD存儲)。
    • 冷數據(>1年商品):HBase列式存儲,按時間范圍分片。
  2. 混合檢索
    • 結構化查詢:品牌、價格等通過ES的Term Query實現。
    • 向量檢索:商品圖片通過Milvus存儲向量,支持“以圖搜物”。
  3. 排序策略
    • 實時排序:銷量(Redis計數器)+ 庫存(ES字段)+ BM25(關鍵詞匹配)。
    • 離線排序:每天用Spark計算商品權重(綜合點擊率、轉化率等指標)。
  4. 容災設計
    • 跨機房副本:主分片分布在3個機房(北京A、北京B、上海),通過Raft協議保證強一致性。
    • 流量切換:當主集群故障時,通過DNS秒級切換至災備集群。

(三)算法應用題

問題:如何優化PageRank算法在海量數據下的計算效率?
回答

  1. 分布式計算:使用MapReduce將網頁鏈接關系分片處理,每個Mapper計算部分網頁的權重,Reducer合并結果。
  2. 增量更新
    • 維護活躍網頁集合(如最近一周有變更的網頁),僅重新計算這些網頁的權重。
    • 通過布隆過濾器快速判斷網頁是否需要更新。
  3. 近似算法:采用Power Iteration近似計算,減少迭代次數(如從100次→10次迭代,誤差控制在5%以內)。

八、典型應用場景與實戰案例

(一)電商搜索:從關鍵詞到語義的升級

案例:某跨境電商搜索優化
  • 挑戰:百萬級SKU,用戶輸入中英文混合查詢(如“running shoes男”),傳統關鍵詞匹配效果差。
  • 解決方案
    1. 多語言分詞:使用Jieba+ICU分詞器處理中英文混合文本。
    2. 向量檢索:商品標題通過BERT生成向量,Milvus實現語義模糊查詢(如搜索“跑步鞋”匹配“running shoes”)。
    3. 實時推薦:結合用戶瀏覽歷史(Redis存儲),在搜索結果中插入相關商品(如“用戶曾瀏覽耐克跑鞋,優先展示耐克商品”)。
  • 效果:搜索點擊率提升35%,平均查詢延遲從800ms降至200ms。

(二)日志分析:秒級定位系統異常

案例:某互聯網公司實時日志監控
  • 需求:每天處理TB級日志,支持秒級查詢“ERROR級別日志+特定IP+近1小時”。
  • 技術方案
    1. 數據管道:Fluentd采集日志→Kafka緩沖→Logstash解析(提取IP、日志級別、時間戳)→ES存儲。
    2. 索引設計
      • 主分片數:根據每天日志量動態計算(如1TB日志≈10個主分片)。
      • 字段類型:IP設為IP類型(支持范圍查詢),時間戳設為Date類型(支持按小時聚合)。
    3. 可視化:Grafana實時展示ERROR日志趨勢,設置閾值自動觸發告警(如ERROR率>1%時通知運維)。
  • 效果:故障定位時間從小時級降至分鐘級,每日查詢響應超時率從15%降至2%。

九、未來趨勢:從搜索到智能問答

(一)多模態搜索的崛起

  • 技術融合:文本+圖像+語音的聯合檢索(如用戶語音提問“推薦紅色運動鞋”,系統同時解析語音文本和用戶上傳的圖片)。
  • 代表工具:Google Multisearch、微軟Bing Visual Search。

(二)生成式AI與搜索引擎的結合

  • 實時知識問答:基于大語言模型(LLM)生成回答,如用戶搜索“如何配置ES分片”,直接返回步驟說明而非網頁列表。
  • 挑戰:確保生成內容的準確性和時效性,避免“幻覺”問題。

(三)隱私增強技術(PETs)

  • 聯邦學習:在不泄露用戶數據的前提下訓練搜索排序模型(如各電商平臺聯合優化通用商品排序算法)。
  • 同態加密:支持加密數據上的關鍵詞檢索(如醫療數據搜索場景)。

十、總結:搜索引擎架構的核心要素

搜索引擎實現海量數據瞬間檢索的關鍵在于:

  1. 倒排索引:通過高效數據結構將查詢復雜度降至常數級。
  2. 分布式架構:分片與副本機制實現水平擴展和高可用。
  3. 近實時技術:段機制與消息隊列確保數據準實時可見。
  4. 混合檢索:關鍵詞匹配與向量語義檢索結合,覆蓋多模態數據。
  5. 工程優化:從索引算法到硬件加速的全鏈路性能調優。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83403.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83403.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83403.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度學習入門:從零搭建你的第一個神經網絡

深度學習入門&#xff1a;從零搭建你的第一個神經網絡 系統化學習人工智能網站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目錄 深度學習入門&#xff1a;從零搭建你的第一個神經網絡摘要引言第一章&#xff1a;神經網絡基礎原理1.1 神經元…

Hadoop 3.x 偽分布式 8088端口無法訪問問題處理

【Hadoop】YARN ResourceManager 啟動后 8088 端口無法訪問問題排查與解決(偽分布式啟動Hadoop) 在配置和啟動 Hadoop YARN 模塊時&#xff0c;發現雖然 ResourceManager 正常啟動&#xff0c;JPS 進程中也顯示無誤&#xff0c;但通過瀏覽器訪問 http://主機IP:8088 時卻無法打…

docker B站學習

鏡像是一個只讀的模板&#xff0c;用來創建容器 容器是docker的運行實例&#xff0c;提供了獨立可移植的環境 https://www.bilibili.com/video/BV11L411g7U1?spm_id_from333.788.videopod.episodes&vd_sourcee60c804914459274157197c4388a4d2f&p3 目錄掛載 尚硅谷doc…

鴻蒙OSUniApp微服務架構實踐:從設計到鴻蒙部署#三方框架 #Uniapp

UniApp微服務架構實踐&#xff1a;從設計到鴻蒙部署 引言 在最近的一個大型跨平臺項目中&#xff0c;我們面臨著一個有趣的挑戰&#xff1a;如何在UniApp框架下構建一個可擴展的微服務架構&#xff0c;并確保其在包括鴻蒙在內的多個操作系統上流暢運行。本文將分享我們的實踐…

Freemarker快速入門

Freemarker概述 FreeMarker 是一款 模板引擎&#xff1a; 即一種基于模板和要改變的數據&#xff0c; 并用來生成輸出文本(HTML網頁&#xff0c;電子郵件&#xff0c;配置文件&#xff0c;源代碼等)的通用工具。 它不是面向最終用戶的&#xff0c;而是一個Java類庫&#xff0c…

操作系統:生態思政

操作系統&#xff1a;生態思政 操作系統&#xff08;OS&#xff09;作為數字世界的基石&#xff0c;其意義遠超單純的技術平臺。它構建了一個包含開發者、用戶、硬件廠商在內的復雜生態系統&#xff0c;其設計理念、運行規則與生態治理模式&#xff0c;無不深刻映射著特定的價…

二進制安全-OpenWrt-uBus

1 需求 需求&#xff1a;ubus list 需求&#xff1a;ubus -v list 需求&#xff1a;ubus -v list zwrt_router.api 2 接口 rootOpenWrt:/# ubus Usage: ubus [<options>] <command> [arguments...] Options:-s <socket>: Set the unix domain …

Rust 學習筆記:自定義構建和發布配置

Rust 學習筆記&#xff1a;自定義構建和發布配置 Rust 學習筆記&#xff1a;自定義構建和發布配置發布配置文件自定義 profile 的選項 Rust 學習筆記&#xff1a;自定義構建和發布配置 發布配置文件 在 Rust 中&#xff0c;發布配置文件是預定義的和可定制的概要文件&#xf…

優化 Transformer 模型:基于知識蒸餾、量化技術及 ONNX

Transformer 模型非常強大&#xff0c;但往往太大太慢&#xff0c;不適合實時應用。為了解決這個問題&#xff0c;我們來看看三種關鍵的優化技術&#xff1a;知識蒸餾、量化和ONNX 圖優化。這些技術可以顯著減少推理時間和內存使用。 為了說明每種技術的利弊&#xff0c;我們以…

Vue3中Axios的使用-附完整代碼

前言 首先介紹一下什么是axios Axios 是一個基于 promise 網絡請求庫&#xff0c;作用于node.js 和瀏覽器中。 它是 isomorphic 的(即同一套代碼可以運行在瀏覽器和node.js中)。在服務端它使用原生 node.js http 模塊, 而在客戶端 (瀏覽端) 則使用 XMLHttpRequests 官方網站…

@Pushgateway自定義腳本推送數據

文章目錄 Pushgateway 自定義腳本推送數據1. 目的2. 適用范圍3. 前提條件4. 操作流程4.1 確定指標類型和格式4.2 編寫推送腳本方法一:使用 curl 命令行推送方法二:使用 Python 腳本推送方法三:使用 Python 客戶端庫推送4.3 設置定時任務4.4 驗證數據5. 高級配置5.1 使用基本…

Git 使用規范指南

Learn Git Branching 1Git 基礎使用流程 1.1初始化與克隆 # 初始化本地倉庫 git init# 克隆遠程倉庫 git clone <repo_url> 一般拉取代碼&#xff0c;直接在文件夾界面打開bash&#xff0c;git clone就行了 1.2日常開發流程 1拉取最新代碼 git pull origin <branc…

設計模式——備忘錄設計模式(行為型)

摘要 備忘錄設計模式是一種行為型設計模式&#xff0c;用于在不破壞封裝性的前提下&#xff0c;捕獲對象的內部狀態并在需要時恢復。它包含三個關鍵角色&#xff1a;原發器&#xff08;Originator&#xff09;、備忘錄&#xff08;Memento&#xff09;和負責人&#xff08;Car…

動態規劃十大經典題型狀態轉移、模版等整理(包括leetcode、洛谷題號)

動態規劃十大經典題目整理 0-1 背包問題&#xff08;0-1 Knapsack Problem&#xff09; LeetCode題號&#xff1a;無直接對應洛谷OJ題號&#xff1a;P1048狀態轉移方程&#xff1a;dp[j] max(dp[j], dp[j - weight[i]] value[i])C代碼模板&#xff1a; int dp[capacity 1…

簡單transformer運用

通俗易懂解讀&#xff1a;hw04.py 文件內容與 Transformer 的應用 這個文件是一個 Python 腳本&#xff08;hw04.py&#xff09;&#xff0c;用于完成 NTU 2021 Spring 機器學習課程的 HW4 作業任務&#xff1a;揚聲器分類&#xff08;Speaker Classification&#xff09;。它…

redis的哨兵模式和Redis cluster

目錄 一. redis的主從復制 二. 哨兵模式 2.1 定義 2.2 作用 2.3 配置實例 三. Redis cluster 3.1 定義 3.2 作用 3.3 配置實例 1. 新建集群文件目錄 2. 準備可執行文件到每個文件夾 3. 開啟群集功能 4. 啟動redis節點 5. 查看是否啟動成功 6. 啟動集群 7. 測試…

簡述八大排序(Sort)

1.插入排序 1.1直接插入排序 給定一組數據&#xff0c;若數據只有一個肯定是有序的&#xff0c;我們將無序數據一個個插入到已有序的數據中。用i遍歷無序數據&#xff0c;j遍歷有序數據&#xff0c;找到合適插入位置&#xff0c;用tmp存放目標插入數據&#xff0c;將其與j對應…

xcode 編譯運行錯誤 Sandbox: rsync(29343) deny(1) file-write-create

解決方法 方法一&#xff1a;修改Targets -> Build Settings 中 ENABLE_USER_SCRIPT_SANDBOXING 設置 NO 方法二&#xff1a;項目使用cocoaPods進行三方管理 且 使用了 use_frameworks&#xff0c;把 use_frameworks 注釋掉,然后重新自行pod install

linux系統中防火墻的操作

防火墻 開放ssh端口 sudo ufw allow 22/tcp # 允許 SSH 連接 sudo ufw enable開放防火墻端口 sudo ufw allow 80/tcp # HTTP sudo ufw allow 443/tcp # HTTPS&#xff08;如果需要&#xff09; sudo ufw enable查看擋墻防火墻設置 sudo ufw status刪除其中一條防火墻規…

[特殊字符] 超強 Web React版 PDF 閱讀器!支持分頁、縮放、旋轉、全屏、懶加載、縮略圖!

在現代 Web 項目中&#xff0c;PDF 瀏覽是一個常見需求&#xff1a;從政務公文到合同協議&#xff0c;PDF 文件無處不在。但很多方案要么體驗不佳&#xff0c;要么集成復雜。今天&#xff0c;我給大家帶來一個開箱即用、功能全面的 PDF 預覽組件 —— [PDFView](https://www.np…