搜索引擎2.0(based elasticsearch6.8)設計與實現細節(完整版)

1 簡介

1.1 背景

《搜索引擎onesearch 1.0-設計與實現.docx》介紹了1.0特性,搜索schema,agg,表達式搜索映射,本文介紹onesearch 2.0 新特性, 參考第2節 規劃特性與發布計劃

1.2 關鍵詞

? 文檔 Document

elasticsearch 一行數據稱為文檔,需要注意與文件/文檔區分,有沖突的地方用“ES文檔”區分

? 索引schema

相當于關系數據庫的schema,xml格式,定義索引的字段,類型,還有搜索策略,分詞等搜索相關屬性

? 搜索/過濾

elasticsearch查詢分兩部分,搜索和過濾,搜索計算文檔與搜索詞相似(匹配)度,得出分數排序,分數越高相似度越高,排序也靠前;過濾相當于sql的where,結果是true或者false

? 查詢對象裝配映射

elasticsearch es dsl 查詢功能非常豐富,可調參數多, 提供精準細致的搜索調整,但也很難用,更難復用,onesearch設計裝配映射組件支持通用表達式轉換esdsl,用戶只需編寫通用表達式,如,((f1=‘a’or f2=’b’) and f3=‘c’)) 即可實現搜索過濾,類似elasticsearch自身也提供了sql查詢功能,大大降低開發難度,同時具備高復用性

1.3 參考資料

再見esdsl, elasticsearch擴展使用通用表達式搜索

分布式datax架構設計 分布式文檔索引全量增量使用分布式datax

分布式 dataX 詳細 (落地) 設計

tika原理源碼分析

2 特性

2.1 大規模/分布式文件索引

? 文檔抓取

1) 文檔內容抓取組件,metadata(base+extras)+content

2) 抓取組件隔離機制

? 索引引擎,基于分布式dataX,支持批量/增量

2.2 精確搜索/多元搜索

? 裝配/映射 增加支持query,目前已支持映射為filter

1) full text查詢映射策略

match

query_string

2) 高亮

3) 返回字段,source/store

4) 批量操作

? springboot starter

3 搜索特性

1. 搜索框,用戶輸入搜索詞

2. 高級搜索,構建搜索過濾表達式,如,(x==’a’ and (y=’abc*’ or z > 100))

3. 統計區,聚合搜索功能,針對搜索內容統計,如文檔的類型計數,一般展示不超過3項,多于3行點擊””查看

4. 標題/內容,標準搜索返回展示,帶高亮

5. 文檔extras屬性(TBD),文檔的專有屬性,如,視頻的播放時間

4 onesearch總體架構

? schema模塊,定義索引字段,索引策略,搜索策略等,管理索引及其搜索特性

? 聚合搜索(agg)模塊,基于schema模塊,支持xml定義agg,零編碼增加agg主題

? 查詢模塊,負責構建通用表達式(如,((f1=‘a’or f2=’b’) and f3=‘c’)),作為搜索輸入條件代替esdsl

? 映射引擎,映射通用表達式為最優的es dsl,支持=,!=,like,in,range,prefix,not/and/or,大小括號,點(.)等操作符映射,解決es dsl難使用,難復用的痛點

? 抽象搜索引擎接口,無縫接入不同的搜索引擎,如,elasticsearch,opensearch,solrcloud等,更可同時使用多種引擎

? 同步,全量同步/增量同步,接入分布式dataX

5 組件架構

下圖是onesearch 2.0組件的架構視圖

抓取器 文檔庫分片/內容抓取,引入tika

索引組件 接入分布式dataX,實現為dataX的reader/writer,實現高吞吐,分布式的文檔索引;依賴setl讀取文件目錄(數據庫表);依賴搜索引起索引服務

搜索引擎 支持批量操作的索引服務,自定義索引策略,索引模式

6 全文搜索-esdsl裝配映射組件

2.0 對裝配映射組件重構,支持完整的映射,增加了query,返回字段支持;1.0 支持 filter,高亮,分頁,排序

? 裝配/映射抽象模型

裝配映射組件設計原理:

搜索請求由多個模塊有機組合而成,如,sql,選擇字段(select), from, where3塊組成

SearchAssemble 裝配器,調用SearchBlockMapping生成模塊,組裝成可執行搜索請求,模板變量T是可執行請求類型

SearchBlockMapping 模塊的映射器,接受SerchConfigBean,映射為搜索請求的模塊,模板變量T是映射生成結果類型,P接受配置類型,

OperatorMapping 表達式映射器

? elasticsearch實現

基于模板的裝配/映射實現

elasticsearch的esdsl有由以下塊(Block)構成:

查詢映射塊,接收QueryPropertis配置,QueryPropertis有兩個映射策略,Match和Query String,

查詢映射塊調用filter映射塊,構建filter部分,filter映射塊調用表達式映射塊轉換filter表達式為esdsl,組成filter塊,再嵌入到查詢塊構建完整的查詢映射塊查詢映射塊模板變量T是字符串(json)類型,P類型是QueryPropertis

選擇字段塊,目前實現source過濾方式,接受SourceFieldsProperties配置,store方式暫沒實現

Agg映射塊 映射后端agg schema配置為AggregationBuilder,即模板變量T是AggregationBuilder

高亮映射塊 模板變量T是HighlightBuilder,即映射生成HighlightBuilder

其他,排序塊,分頁塊比較簡單沒有實現為塊映射

TemplateESSearchAssemble 裝配實現,T是SearchSourceBuilder, 即裝配返回SearchSourceBuilder

? 默認即可用

裝配映射配置復雜,用戶使用比較麻煩,涉及細致的調參,本著默認即可用的理念,組件提供默認的配置

1. 選擇字段塊,source字段方式,排除_content字段(如果有)

2. query, match查詢,text字段匹配搜索詞,其他字段用于filter表達式

3. 高亮,text字段設置高亮,高亮優先,_content字段排除在返回中,只有高亮,但高亮默認設置noMathcSize屬性

7 索引組件

reader/transformer/writer datax作業組件組合,reader讀取文檔內容,屬性+內容的形式;writer依賴搜索引擎

本版本文檔目錄從數據庫讀取,setl-data提供統一的dao接口,無縫切換不同的驅動;marker支持輪詢增量的組件;數據庫支持事務log,可使用setl-data的cdc組件

file-storage 文檔(流)載入組件,支持多庫多協議

document-extractor 文件解釋內容抓取,核心使用tika

7.1 文件存取組件(file-storage)

文檔索引首先需要載入文檔,文檔載入兩個關鍵,文檔地址讀寫協議

file-storage提供統一FileService接口,橋接地址和協議,提供多庫多協議讀取能力;

組件根據url,如,schema://rootUrl/, 選擇對應FileService

組件目前支持本地磁盤,smb,ali oss,ftp,minio

7.2 抓取器組件(extractor)

組件使用tika解釋和抓取文檔內容

IndexingDocument 索引資源bean,屬性+內容,索引文檔Id對于后期增量同步很重要,提供兩種id生成,url和文檔id,其中文檔id為了支持多庫,增加文檔庫編號sn字段,組成”sn-id“作為索引id

? 內容處理器

tika很好的解釋文檔,抓取文檔內容,但留下一個問題,BodyContentHandler實現是基于內存的,需要用戶設置write-limit限制內存使用,OOM問題交給用戶了。

文檔索引,大文件會產生大容量內容,同時datax reader/transformer/writer鏈路長,內存使用時間長,write-limit設置顯得困難,內容容量大,內存使用高,容易出現oom,只能降低并發度,因此需要實現基于磁盤的內容處理器

BodyContentHandler依賴Writer寫入內容,基于文件內容處理器核心是實現FileBasedWriter,使用臨時文件,reader實例化,載入文檔,datax writer寫入es,然后釋放流和刪除臨時文件

寫入階段仍然需要流生成內存字節,但縮短內存使用時間

7.3 轉換組件(transformer)

轉換的設計參考 datax基于規則轉換(RBT)組件+圖數據庫間同步設計與實現

StreamRecord,支持大容量文本以文件流形式傳遞

SyncStreamRecord 攜帶Marker,參考增量索引

7.4 全量文檔索引

7.4.1 文檔分片遍歷

接入分布式dataX,需要分片的策略,無重復無遺漏的遍歷所有的文檔

a) 數據庫分片

數據表的分片

b) 目錄分支分片

節點分配一個分支(路徑),該策略簡單,但容易出現分配傾斜

c) 文件名哈希

所有節點遍歷整個文檔目錄,只處理分派給自身的hash分片,該策略分配比較均衡,需要完整統一的文件名hash實現,能處理不同語言,特殊字符的hash計算

7.4.2 Reader

Reader 分段,分頁,抓取器->StreamRecord

7.4.3 Writer

Writer Record->IndexingDocument->索引服務->寫入elasticsearch

Writer依賴onesearch組件,onesearch提供的索引服務,因此writer實現非常簡單

索引使用StreamRecord傳遞數據,根據onesearch getter機制獲取索引屬性,實現StreamRecordValueGetter

關于onesearch getter組件參考《搜索引擎onesearch 1.0-設計與實現.docx》

7.4.4 技術架構

批量分布式索引技術架構

client 負責寫入任務組分片;觸發 worker 執行;client 可集成到管理臺;作業監管,檢測作業完成,清理作業環境

watcher 作業統計,輸出統計;按作業分片觀測和聚合計算; watcher 可集成到管理臺

worker 分配分片;任務(組)執行,任務組執行統計

8 增量索引

8.1 標記組件

標記(marker/xmarker)組件用于資源切分, 如,數據表/文件,

marker使用表里的單調遞增字段,每次批處理升序排序的數據,處理完記錄最后一個,即最大value,下次獲取數據>value獲取未處理數據,這種方式會重復處理數據,應用需要識別或支持冪等

xmarker增加hash值,支持橫向切分

8.2 增量分片

全量是有上下邊界的大表,分頁即分片,而增量是有下屆沒有上界的表,也可以使用與全量一樣的分片,最上面的分片無上界,這里引入另一種方式,hash分片,worker分配取模數,worker獲取文件數據,使用設定的字段取模,只處理等于分配的hash的記錄,組件使用updateTime取模,這種適用于增量,分片不用改變,而增量的分片一次性,每次運行前重新計算分片上下界

8.3 增量reader/writer

Reader 讀取文檔記錄,構建SyncStreamRecord,攜帶XMarker

Writer 與全量同一個writer,判斷record類型,取出XMarker,更新marker

8.4 技術架構

分布式架構使用分布式datax,與全量基本一致架構,上圖用另一種表達方式,與全量不同,增量client是定時任務,全量是一次性執行

9 spring boot starter

spring boot starter自動配置組件

ESClientBeanConfig elasticsearch rest client 構建和初始化,索引和搜索均使用到

SchemaBeanConfig 索引schema, 序列化器,索引和搜索均使用到

ESIndexServiceBeanConfig 引擎層索引服務/文檔服務

DocumentServiceBeanConfig 服務層文檔服務,getter庫

ESSearchMappingBeanConfig elasticsearch 搜索裝配映射bean,包括裝配器,高亮塊映射,查詢塊映射,operator庫等

ESSearchServiceBeanConfig 引擎層搜索服務

SearchServiceBeanConfig 服務層搜索服務

10接口

10.1 datax作業管理api

寫入/重置/刪除 分布式datax作業,client/worker/watcher

10.2 通用作業管理api

11工程

? 索引組件

indexing-document 文檔索引,規劃增加數據庫索引組件

indexing-document-common 公共常量定義,公共組件

indexing-document-datax 單機datax工程

indexing-document-extractor 抓取器,解釋文檔,抓取文檔屬性和內容

indexing-document-reader 全量reader

indexing-document-syncreader 增量reader

indexing-document-reader 轉換

indexing-document-reader writer,支持全量和增量

? onessearch

12 zookeeper結構

warcher 域內唯一,處理域內所有作業的統計,使用時間槽方式定時調度

worker 全量/增量工作節點,分片是taskgroup

client 域內唯一,只有增量client定時執行,全量不需要

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

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

相關文章

【ClickHouse】RollingBitmap

ClickHouse 的 RollingBitmap 是一種基于 Bitmap 的數據結構,用于高效處理數據的動態變化和時間窗口計算。以下是關于 ClickHouse RollingBitmap 的相關信息: RollingBitmap 的應用場景 RollingBitmap 主要用于需要處理動態數據和時間窗口計算的場景&am…

新版智慧社區(小區)智能化弱電系統解決方案

該方案聚焦新版智慧社區智能化弱電系統建設,以物聯網、云計算、AI 人臉識別等技術為支撐,構建涵蓋智能可視化對講、智慧門禁、智能梯控、智慧停車、視頻監控等核心系統的社區智能化體系,并通過智慧社區集成平臺實現設備管理、數據統計、預警聯動等功能。方案旨在解決傳統社區…

11高可用與容錯

一、Broker 高可用架構設計 1.1 RabbitMQ 鏡像集群方案 集群搭建步驟 # 節點1初始化 rabbitmq-server -detached rabbitmq-plugins enable rabbitmq_management# 節點2加入集群 rabbitmqctl stop_app rabbitmqctl join_cluster rabbitnode1 rabbitmqctl start_app# 創建鏡像…

AsyncIOScheduler與BackgroundScheduler的線程模型對比

1. BackgroundScheduler的線程機制? ?多線程模型?:BackgroundScheduler基于線程池執行任務,默認通過ThreadPoolExecutor創建獨立線程處理任務,每個任務運行在單獨的線程中,主線程不會被阻塞。?適用場景?:適合同步…

ceph 對象存儲用戶限額滿導致無法上傳文件

查看日志 kl logs -f rook-ceph-rgw-my-store-a-5cc4c4d5b5-26n6j|grep -i error|head -1Defaulted container "rgw" out of: rgw, log-collector, chown-container-data-dir (init) debug 2025-05-30T19:44:11.573+0000 7fa7b7a6d700

2025-05-31 Python深度學習9——網絡模型的加載與保存

文章目錄 1 使用現有網絡2 修改網絡結構2.1 添加新層2.2 替換現有層 3 保存網絡模型3.1 完整保存3.2 參數保存(推薦) 4 加載網絡模型4.1 加載完整模型文件4.2 加載參數文件 5 Checkpoint5.1 保存 Checkpoint5.2 加載 Checkpoint 本文環境: Py…

批量導出CAD屬性塊信息生成到excel——CAD C#二次開發(插件實現)

本插件可實現批量導出文件夾內大量dwg文件的指定塊名的屬性信息到excel,效果如下: 插件界面: dll插件如下: 使用方法: 1、獲取此dll插件。 2、cad命令行輸入netload ,加載此dll(要求AutoCAD&…

在Linux環境里面,Python調用C#寫的動態庫,如何實現?

在Linux環境中,Python可以通過pythonnet(CLR的Python綁定)或subprocess調用C#動態庫。以下是兩種方法的示例: 方法1:使用pythonnet(推薦) 前提條件 安裝Mono或.NET Core運行時安裝pythonnet包…

小程序跳轉H5或者其他小程序

1. h5跳轉小程序有兩種情況 &#xff08;1&#xff09;從普通瀏覽器打開的h5頁面跳轉小程序使用wx-open-launch-weapp可以實現h5跳轉小程序 <wx-open-launch-weappstyle"display:block;"v-elseid"launch-btn":username"wechatYsAppid":path…

性能優化 - 案例篇:緩沖區

文章目錄 Pre1. 引言2. 緩沖概念與類比3. Java I/O 中的緩沖實現3.1 FileReader vs BufferedReader&#xff1a;裝飾者模式設計3.2 BufferedInputStream 源碼剖析3.2.1 緩沖區大小的權衡與默認值 4. 異步日志中的緩沖&#xff1a;Logback 異步日志原理與配置要點4.1 Logback 異…

文檔整合自動化

主要功能是按照JSON文件&#xff08;Sort.json&#xff09;中指定的順序合并多個Word文檔&#xff08;.docx&#xff09;&#xff0c;并清除文檔中的所有超鏈接。最終輸出合并后的文檔名為"sorted_按章節順序.docx"。 主要分為幾個部分&#xff1a; 初始化配置 定…

嵌入式(C語言篇)Day13

嵌入式Day13 一段話總結 文檔主要介紹帶有頭指針和尾指針的單鏈表的實現及操作&#xff0c;涵蓋創建、銷毀、頭插、尾插、按索引/數據增刪查、遍歷等核心操作&#xff0c;強調頭插/尾插時間復雜度為O(1)&#xff0c;按索引/數據操作需遍歷鏈表、時間復雜度為O(n)&#xff0c;并…

【ASR】基于分塊非自回歸模型的流式端到端語音識別

論文地址:https://arxiv.org/abs/2107.09428 摘要 非自回歸 (NAR) 模型在語音處理中越來越受到關注。 憑借最新的基于注意力的自動語音識別 (ASR) 結構,與自回歸 (AR) 模型相比,NAR 可以在僅精度略有下降的情況下實現有前景的實時因子 (RTF) 提升。 然而,識別推理需要等待…

RNN循環網絡:給AI裝上“記憶“(superior哥AI系列第5期)

&#x1f504; RNN循環網絡&#xff1a;給AI裝上"記憶"&#xff08;superior哥AI系列第5期&#xff09; 嘿&#xff01;小伙伴們&#xff0c;又見面啦&#xff01;&#x1f44b; 上期我們學會了讓AI"看懂"圖片&#xff0c;今天要給AI裝上一個更酷的技能——…

DAY41 CNN

可以看到即使在深度神經網絡情況下&#xff0c;準確率仍舊較差&#xff0c;這是因為特征沒有被有效提取----真正重要的是特征的提取和加工過程。MLP把所有的像素全部展平了&#xff08;這是全局的信息&#xff09;&#xff0c;無法布置到局部的信息&#xff0c;所以引入了卷積神…

【仿生系統】愛麗絲機器人的設想(可行性優先級較高)

非程序化、能夠根據環境和交互動態產生情感和思想&#xff0c;并以微妙、高級的方式表達出來的能力 我們不想要一個“假”的智能&#xff0c;一個僅僅通過if-else邏輯或者簡單prompt來模擬情感的機器人。您追求的是一種更深層次的、能夠學習、成長&#xff0c;并形成獨特“個性…

面向連接的運輸:TCP

目錄 TCP連接 TCP報文段結構 往返時間估計與超時 可靠數據傳輸 回退N步or超時重傳 超時間隔加倍 快速重傳 流量控制 TCP連接管理 三次握手 1. 客戶端 → 服務器&#xff1a;SYN 包 2. 服務器 → 客戶端&#xff1a;SYNACK 包 3. 客戶端 → 服務器&#xff1a;AC…

SpringAI系列 - 升級1.0.0

目錄 一、調整pom二、MessageChatMemoryAdvisor調整三、ChatMemory get方法刪除lastN參數四、QuestionAnswerAdvisor調整Spring AI發布1.0.0正式版了?? ,搞起… 一、調整pom <properties><java.version>17</java.version><spring-ai.version>

前端高頻面試題2:JavaScript/TypeScript

1.什么是類數組對象 一個擁有 length 屬性和若干索引屬性的對象就可以被稱為類數組對象&#xff0c;類數組對象和數組類似&#xff0c;但是不能調用數組的方法。常見的類數組對象有 arguments 和 DOM 方法的返回結果&#xff0c;還有一個函數也可以被看作是類數組對象&#xff…

Spring Security入門:創建第一個安全REST端點項目

項目初始化與基礎配置 創建基礎Spring Boot項目 我們首先創建一個名為ssia-ch2-ex1的空項目(該名稱與配套源碼中的示例項目保持一致)。項目需要添加以下兩個核心依賴: org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-secur…