近期“知網(wǎng)”的熱度一直不減,本來可以拿一些熱點圖片、網(wǎng)友評論作為開場。算了,這不是我一個技術博主該做的。
此處僅拿2022年5月24日早晨 6:00 微博搜索“知網(wǎng)”得到的前20條動態(tài)信息的詞云說話。
在網(wǎng)友不建議專家建議的大環(huán)境下,作為老百姓對“知網(wǎng)”的建議如下:
1、尊重版權(quán),每篇文檔被下載(人工備案下載,非爬蟲)獲得的收益一半(比例待商榷)費用給第一作者,這會極大的激發(fā)大家的創(chuàng)作動力。
2、將文章收益、被引用次數(shù)等作為未來文章評價指標。好文章(被引用多、被下載多)會有高收益,不好的文章會石沉大海。這會極大鼓勵高校研究人員寫好文章。
此處省略1萬字......
當然,這些都不是我們平頭老百姓該操心的事,作為技術人員,我更關注“知網(wǎng)”的本質(zhì)——搜索。進一步說根據(jù)用戶復雜的搜索條件,召回滿意的結(jié)果。
問題來了,Elasticsearch 三大核心應用場景之一全文檢索。用 Elasticsearch 能不能造一個“知網(wǎng)”呢?
這引發(fā)了我的極大的興趣。
首先,為避免“井底之蛙”,需求降級,降低到自己可控的程度。
其次,“知網(wǎng)”支持的搜索非常復雜,我們只研究“一框”搜索。
把標題檢索搞明白了,其他只是時間問題。
再次,“知網(wǎng)”是全網(wǎng)論文的集合體,我們聚焦本地磁盤文件的集合體。
文件類型包含但不限于:.txt, .pdf, .ppt, .doc,.docx 等文檔。
綜上,為避免落成“螳臂當車”的笑柄,我們把需求轉(zhuǎn)化為簡版的“知網(wǎng)”——本地知識庫檢索系統(tǒng)。
核心功能點如下:
原則:不重復造輪子,自己可控,使用已有的、成熟的、開源的技術棧體系。
2017 年我?guī)ьI小伙伴做過類似的知識庫檢索系統(tǒng),只不過當時的技術體系較舊,Elasticsearch 也是2.X 版本。
相關技術實現(xiàn)如下兩圖所示:
關于文檔格式轉(zhuǎn)換及解析器,又會涉及如下 N 多技術棧。
早期的技術實現(xiàn)大半時間都花費在了文檔格式轉(zhuǎn)換和解析處理上。有沒有更好的實現(xiàn)方式,一直是我關心的問題。從最早的自己找各類解析工具用到了 openoffice 組件,到內(nèi)容檢測和分析框架 Tika,再到 Elasticsearch 自身支持的 Ingest Attachment 文檔處理器插件,最終到 Elastic 工程師開源的文檔爬蟲工具——FSCrawler。
相比于閉源的金山WPS、微軟Office,OpenOffice 現(xiàn)在已經(jīng)成為全球領先的跨平臺、全功能、多語言、公開對象接口、可擴展文件格式的開源辦公軟件 。引入相關 jar 包,即可實現(xiàn)文檔的解析工作。
http://www.openoffice.org/
Apache Tika 用Java編寫,用于文件類型檢測和從各種格式的文件內(nèi)容提取的庫。
使用Tika可以開發(fā)出通用型檢測器和內(nèi)容提取到的不同類型的文件,如電子表格,文本文件,圖像,PDF文件甚至多媒體輸入格式,在一定程度上提取結(jié)構(gòu)化文本以及元數(shù)據(jù)。
https://tika.apache.org/
基于 Tika 實現(xiàn)的 Elasticsearch 文件處理插件,支持:PPT、XLS、PDF、WORD 等格式。
需要單獨安裝實現(xiàn),安裝實現(xiàn)如下:
sudo bin/elasticsearch-plugin install ingest-attachment
https://www.elastic.co/guide/en/elasticsearch/plugins/current/ingest-attachment.html
2019-02-25 我在社群給小伙伴推薦過,當時我寫了如下的兩段話。
應用場景:文件系統(tǒng)檢索、中文知識庫構(gòu)建、簡化pdf、office等文檔解析繁瑣步驟,一鍵導入構(gòu)建索引實現(xiàn)檢索等操作。
使用效果(推薦理由):
https://github.com/dadoonet/fscrawler
https://t.zsxq.com/02EMR7MRn
誠然,僅從更貼合 Elasticsearch 實現(xiàn)的角度來講,F(xiàn)SCrawler 是文檔分析的“終結(jié)者”。它幾乎包含了我上面所述兩幅圖的全部技術實現(xiàn)。
所以,我們選型 FSCrawler 作為文檔數(shù)據(jù)源處理+寫入 Elasticsearch 同步工具。
Flask 是目前最流行的 Python Web 框架之一。自 2010 年開源以來,F(xiàn)lask 受到了越來越多的 Python 開發(fā)者的喜歡,其受歡迎程度不輸于 Django。
Flask 足夠輕量,只用 5 行就能寫出一個最簡單的 Web 程序,但并不簡陋,它能適應各類項目的開發(fā)。
截止:2022-05-24,GitHub Flask 框架 star 數(shù):59.1k。
下圖代表 Google 搜索走勢,黃色:springboot,藍色:django,藍色:flask。flask 和 django 走勢基本一致,受歡迎程度較高。
基于此,Web 部分我們選型 Python Flask 框架。
基于前面的需求分析和技術選型,整體架構(gòu)&數(shù)據(jù)流圖如下圖所示。
相當于之前的分類型文檔解析自己獨立實現(xiàn),F(xiàn)SCrawler 可謂“大包大攬”、“以一敵十”,之前最復雜、最困難的工作全部交由 FSCrawler 完成,包含但不限于:
有了上面的圖,整體就會非常釋然,就剩下四個字“干就完了”。
直接來個 Gif 動圖,看一下實現(xiàn)效果。
相比于之前 java 開發(fā)的 web 系統(tǒng),這次是我全棧實現(xiàn),涉及到技術包含但不限于:Html、CSS、Javascript、Python、Flask、Elasticsearch、Kibana、FSCrawler。
Html:頁面框架。
CSS:頁面美化。
JavaScript:動態(tài)更新樣式的腳本實現(xiàn)。
Python:后端服務接口。
Flask:后端服務框架。
Elasticsearch:數(shù)據(jù)落地存儲。
Kibana:數(shù)據(jù)可視化分析。
FSCrawler:本地磁盤文檔爬蟲解析并寫入Elasticsearch。
由于足夠輕量級,累計核心代碼不到 1000 行。
取名為:織網(wǎng)知識庫檢索系統(tǒng)。此“織網(wǎng)”非彼“知網(wǎng)”?!翱棥睆娬{(diào)的“精耕細作、日積月累、功不唐捐、水滴石穿”。
詳情頁
各位基礎穩(wěn)定數(shù)據(jù)統(tǒng)計如下:
本系統(tǒng)涉及的文檔數(shù)比較少,但要對 Elastic 充滿信心。Elasticsearch 支持動態(tài)擴展,支持成千上萬、數(shù)億、數(shù)十億只是配置問題和數(shù)據(jù)量問題,技術層面沒有問題。
回歸文章初心,“知網(wǎng)”是個非常龐大的功能體,僅就檢索細節(jié)討論的話,涉及很大一塊的內(nèi)容就是內(nèi)容分析(分詞處理、命名實體識別等 NLP 自然語言處理領域的知識)、以及文檔之間的關聯(lián)性(引用、被引用)等,是不小的工程。
本文是以“知網(wǎng)”的文檔檢索出發(fā),構(gòu)建了本地知識庫系統(tǒng),驗證了 Elasticsearch 技術棧結(jié)合 Python Flask 構(gòu)建知識庫檢索系統(tǒng)的可行性。
掃碼一起視頻聊一聊