Web系統實作搜尋功能要針對附加文件的方法之一
這個應該算是最簡單的解決方法,簡單來講搜尋還是在SQL裡面搜尋,只是在上傳檔案的時候,先針對檔案開啟,然後讀取全部的文字,放到一個大型的文字儲存欄位裡面。
在MS SQL裡面可以針對大型文字檔案進行全文本檢索,只要有設定全文本索引就好,這樣查詢很多檔案,文字內容又很多的時候用CONTAINS(欄位,’關鍵字’)在Where條件中,就可以查到想要的檔案。
設計小技巧
SHA256是個好東西,MD5也是,但SHA256字串較長,用這個雜湊值當索引如果重複大概比中樂透機率還低,但例外還是要處理好就是了。
可以做一個Table名叫FileToText,有兩個欄位:FileHashCode(主索引)和FileContent(全文本索引),如果要加上FileName也可以,因為我規劃的系統存檔案在File System中是用Hash code作為檔名,而Hash Code的FileName我在不同的功能項會有不同的表來存。
為什麼要這樣?因為有可能兩個人傳了同一個Hash Code的檔案,但上傳時檔名不同,且我們的系統不只一個地方可以上傳檔案,所以要多個表來記錄。
要怎麼讀取文件內文
推薦一個MIT License的C#程式庫:DocumentFormat.OpenXml,用法可以上網路查,因為我這邊只想做概念的分享不想做教學。這個程式庫可以做到Word、Excel、PowerPoint這些檔案。
然後PDF的話用PdfPig,這個是Apache License 2.0授權的,記得要符合規範,比如該寫說使用這個組件要註明,也要把對方的授權聲明附加在自己的授權聲明後面。
PdfPig的授權聲明比較特別是因為他有用到Adobe的一些免費的字型,因此最好還是把整個檔案附加上去。
讀取的程式碼有一個簡單的做法就是問ChatGPT,它絕對解釋比我清楚還會寫完整的範例程式片段。或者去OpenAI註冊一個付費會員用API然後用它的Playground來用GPT4。
總結
這篇沒有要解釋怎樣寫代碼,因為GPT4寫的代碼又漂亮又清楚,連我都是問它才會用,然後GitHub Copilot讓寫程式根本不用動太多腦了也不用打太多字,我還用JetBrain的Rider寫還會幫我把foreach轉成LINQ語法。
這三個組合是我目前程式設計覺得最強的Combo,等Google的AI有空試看看再來比較哪個比較好用。
簡單來講只要把全文都存到資料庫去,又開啟全文本索引,這樣就可以針對FileHashCode查到哪個文件有哪個字,再用FileHashCode去找比如Topics有哪一筆資料有上傳它的。