近期“知網”的熱度一直不減,本來可以拿一些熱點圖檔、網友評論作為開場。算了,這不是我一個技術部落客該做的。
此處僅拿2022年5月24日早晨 6:00 微網誌搜尋“知網”得到的前20條動态資訊的詞雲說話。
基于 ik_smart 中文分詞器的詞雲圖
在網友不建議專家建議的大環境下,作為老百姓對“知網”的建議如下:
- 1、尊重版權,每篇文檔被下載下傳(人工備案下載下傳,非爬蟲)獲得的收益一半(比例待商榷)費用給第一作者,這會極大的激發大家的創作動力。
- 2、将文章收益、被引用次數等作為未來文章評價名額。好文章(被引用多、被下載下傳多)會有高收益,不好的文章會石沉大海。這會極大鼓勵高校研究人員寫好文章。
此處省略1萬字......
當然,這些都不是我們平頭老百姓該操心的事,作為技術人員,我更關注“知網”的本質——搜尋。進一步說根據使用者複雜的搜尋條件,召回滿意的結果。
問題來了,Elasticsearch 三大核心應用場景之一全文檢索。用 Elasticsearch 能不能造一個“知網”呢?
這引發了我的極大的興趣。
1、需求分析
首先,為避免“井底之蛙”,需求降級,降低到自己可控的程度。
- 天眼查了一下:“知網成立于2004年,共1649人”。得出初步結論,這是有18年技術積累的公司。
- 版權原因,我們也拿不到知網那麼多的資料,隻能先象征性的拿手裡的文檔模拟一下,研究技術的可行性。
其次,“知網”支援的搜尋非常複雜,我們隻研究“一框”搜尋。
把标題檢索搞明白了,其他隻是時間問題。
再次,“知網”是全網論文的集合體,我們聚焦本地磁盤檔案的集合體。
檔案類型包含但不限于:.txt, .pdf, .ppt, .doc,.docx 等文檔。
綜上,為避免落成“螳臂當車”的笑柄,我們把需求轉化為簡版的“知網”——本地知識庫檢索系統。
核心功能點如下:
- 支援多種格式曆史文檔(pdf、ppt、doc、xls、txt)的解析及索引化。
- 支援文檔基礎資料(标題、大小、釋出時間、修改時間、作者、全文)的模組化。
- 支援新寫入文檔資料的解析及索引化,定時周期可配置。
- 支援模組化後的資料存入Elasticsearch,支援通過浏覽器通路。
- 支援kibana可視化分析。
2、技術選型
原則:不重複造輪子,自己可控,使用已有的、成熟的、開源的技術棧體系。
2017 年我帶領小夥伴做過類似的知識庫檢索系統,隻不過當時的技術體系較舊,Elasticsearch 也是2.X 版本。
相關技術實作如下兩圖所示:
關于文檔格式轉換及解析器,又會涉及如下 N 多技術棧。
早期的技術實作大半時間都花費在了文檔格式轉換和解析處理上。有沒有更好的實作方式,一直是我關心的問題。從最早的自己找各類解析工具用到了 openoffice 元件,到内容檢測和分析架構 Tika,再到 Elasticsearch 自身支援的 Ingest Attachment 文檔處理器插件,最終到 Elastic 工程師開源的文檔爬蟲工具——FSCrawler。
2.1 OpenOffice
相比于閉源的金山WPS、微軟Office,OpenOffice 現在已經成為全球領先的跨平台、全功能、多語言、公開對象接口、可擴充檔案格式的開源辦公軟體 。引入相關 jar 包,即可實作文檔的解析工作。
http://www.openoffice.org/
2.2 Tika
Apache Tika 用Java編寫,用于檔案類型檢測和從各種格式的檔案内容提取的庫。
使用Tika可以開發出通用型檢測器和内容提取到的不同類型的檔案,如電子表格,文本檔案,圖像,PDF檔案甚至多媒體輸入格式,在一定程度上提取結構化文本以及中繼資料。
https://tika.apache.org/
2.3 Ingest Attachment 檔案處理器插件
基于 Tika 實作的 Elasticsearch 檔案處理插件,支援:PPT、XLS、PDF、WORD 等格式。
需要單獨安裝實作,安裝實作如下:
sudo bin/elasticsearch-plugin install ingest-attachment
複制
https://www.elastic.co/guide/en/elasticsearch/plugins/current/ingest-attachment.html
2.4 FSCrawler 文檔爬蟲工具
2019-02-25 我在社群給小夥伴推薦過,當時我寫了如下的兩段話。
應用場景:檔案系統檢索、中文知識庫建構、簡化pdf、office等文檔解析繁瑣步驟,一鍵導入建構索引實作檢索等操作。
使用效果(推薦理由):
- 1、效果不錯,已經內建提卡映射Mapping可定制。
- 2、內建得非常好。自己寫的話:第一步,不同類型解析(pdf還有可能涉及OCR識别)、第二步:定好mapping,第三步:導入。
- 3、各種配置寫得很一目了然,上手快。
- 4、全部開源,如果有需要可以定制化改代碼。
- 5、支援5.x,6.x,以及還未公布的7.x。(ps現在 7.X、8.X 都已經支援)
- 6、作者貌似是 Elastic 公司的。
https://github.com/dadoonet/fscrawler
https://t.zsxq.com/02EMR7MRn
誠然,僅從更貼合 Elasticsearch 實作的角度來講,FSCrawler 是文檔分析的“終結者”。它幾乎包含了我上面所述兩幅圖的全部技術實作。
是以,我們選型 FSCrawler 作為文檔資料源處理+寫入 Elasticsearch 同步工具。
2.5 Python Flask 輕量級 Web 架構
Flask 是目前最流行的 Python Web 架構之一。自 2010 年開源以來,Flask 受到了越來越多的 Python 開發者的喜歡,其受歡迎程度不輸于 Django。
Flask 足夠輕量,隻用 5 行就能寫出一個最簡單的 Web 程式,但并不簡陋,它能适應各類項目的開發。
截止:2022-05-24,GitHub Flask 架構 star 數:59.1k。
下圖代表 Google 搜尋走勢,黃色:springboot,藍色:django,藍色:flask。flask 和 django 走勢基本一緻,受歡迎程度較高。
基于此,Web 部分我們選型 Python Flask 架構。
3、 整體架構
基于前面的需求分析和技術選型,整體架構&資料流圖如下圖所示。
相當于之前的分類型文檔解析自己獨立實作,FSCrawler 可謂“大包大攬”、“以一敵十”,之前最複雜、最困難的工作全部交由 FSCrawler 完成,包含但不限于:
- PDF、DOC、XLS、TXT等文檔讀取解析
- Elasticsearch 資料模組化
- 批量資料同步寫入 Elasticsearch
- 定時同步任務
- 針對特定圖檔式樣的 PDF 文檔,需要OCR 識别實作
有了上面的圖,整體就會非常釋然,就剩下四個字“幹就完了”。
4、 系統實作
直接來個 Gif 動圖,看一下實作效果。
相比于之前 java 開發的 web 系統,這次是我全棧實作,涉及到技術包含但不限于:Html、CSS、Javascript、Python、Flask、Elasticsearch、Kibana、FSCrawler。
- Html:頁面架構。
- CSS:頁面美化。
- JavaScript:動态更新樣式的腳本實作。
- Python:後端服務接口。
- Flask:後端服務架構。
- Elasticsearch:資料落地存儲。
- Kibana:資料可視化分析。
- FSCrawler:本地磁盤文檔爬蟲解析并寫入Elasticsearch。
由于足夠輕量級,累計核心代碼不到 1000 行。
取名為:織網知識庫檢索系統。此“織網”非彼“知網”。“織”強調的“精耕細作、日積月累、功不唐捐、水滴石穿”。
首頁
清單頁
詳情頁
各位基礎穩定資料統計如下:
本系統涉及的文檔數比較少,但要對 Elastic 充滿信心。Elasticsearch 支援動态擴充,支援成千上萬、數億、數十億隻是配置問題和資料量問題,技術層面沒有問題。
5、小結
回歸文章初心,“知網”是個非常龐大的功能體,僅就檢索細節讨論的話,涉及很大一塊的内容就是内容分析(分詞處理、命名實體識别等 NLP 自然語言處理領域的知識)、以及文檔之間的關聯性(引用、被引用)等,是不小的工程。
本文是以“知網”的文檔檢索出發,建構了本地知識庫系統,驗證了 Elasticsearch 技術棧結合 Python Flask 建構知識庫檢索系統的可行性。
當然,一個系統的建構還會涉及很多其他細節内容,篇幅有限。我們找個時間給大家視訊分享一下,一起探讨一下 Elasticsearch 在知識庫檢索系統中的應用。
參考
李輝《Flask Web 開發實戰》
https://blog.csdn.net/laoyang360/article/details/75933314
Elasticsearch打造知識庫檢索系統
https://medium.com/analytics-vidhya/building-a-basic-search-engine-using-elasticsearch-fscrawler-97104c1ea220