當前位置:
首頁 > 知識 > 使用Elasticsearch搭建一個文件搜索系統

使用Elasticsearch搭建一個文件搜索系統

何為文件搜索系統?其實簡單一點,就可以想像為一個帶用戶界面的grep,可以根據你提供的關鍵字查詢包含該內容的文件。與grep一樣,該系統應該能返回包含該搜索條件的文件名,行號和具體內容等,同時應該支持高亮。與grep只支持正則表達式不一樣的是,以elasticsearch為基礎的搜索系統,能支持更多的搜索模式和匹配模式。當然,我們的系統肯定是比grep提供更多的功能。

基本需求

特點如下:

基於web的用戶界面,使用瀏覽器就可以直接訪問

可以對文件內容進行搜索和匹配,並且返迴文件基本信息和關鍵字高亮,並提供鏈接遠程打開文件

支持各種富文本內容,包括ppt, pdf等

可以監控文件的變化,當文件有增刪改之後,能夠重新索引文件

我們先看看最終的效果:

任務分解

再簡單分解一下所需要的技術:

web前端:

UI:提供搜索條、展示搜索結果面板和文件打開鏈接

邏輯:將搜索內容組裝為elasticsearch的搜索語句發送到後端,並且將response進行合理的處理

web後端:

web伺服器提供web API服務

同時對接elasticsearch,作為中間件,處理 前端請求 —— elasticsearch 之間的互動

web文件伺服器,提供靜態文件的訪問

資料庫:

elasticsearch作為資料庫,包含文件的索引和基本信息

文件監控與索引

需要對特定目錄下的文件進行監控和索引

任何的增刪改動作都觸發文件的索引(把文件索引到elasticsearch當中,以便可以搜索)

咋一看貌似挺複雜的。但如同所有的軟體開發,只要不是特別創新的功能,總會有人已經幫你踩好了坑,我們要做的是找到合適的輪子而不是重複造輪子(一開始也是打算自己把這套東西都實現了,結果一google,啥都有)。

為了更方便的集成搜索服務到你的APP或者網站,elastic提供了一套search UI (官網)。只需要寥寥幾行代碼,即可內嵌一個非常美觀的search套件到你的應用或者網站當中。我們的實現也主要是基於這個search UI.

具體的代碼可查地址。

web 前端

但是這套工具的是默認你使用App search或者site search服務的,其介面設置是使用一個connector與遠程的search服務進行交互。

如果我們沒有購買類似的服務,只能修改這個代碼為使用本地的elasticsearch。具體的示例在github上也能找到,我們的代碼也是基於這個example。

所需的component大致如下:

package.json:

需要重寫一下autoComplete.js以適配我們自己的數據格式

web 後端

以上項目已經實現了一個nodeJs的後端,直接啟動npm start即可,但需要注意的是,需要通過環境變數指定elasticsearch的url,即完整的命令是:

ELASTICSEARCH_HOST=http://localhost:9200 npm start

索引替換

前面我們提到後端需要對接elasticsearch,作為中間件,處理 前端請求 —— elasticsearch 之間的互動,這部分代碼框架已經實現了,我們要做的是把索引替換為我們自己的索引。

文件監控與索引

這裡,我們使用 fscrawler 就能完全滿足我們的需求。因為文檔很齊全,我這裡就不一一解釋了。

我這裡監控了一個目錄/Users/Documents/AWS:

則對應的配置文件,簡單的可以設置為:

以下是該工具寫入到es的對象為:

{

_index: files,

_type: _doc,

_id: f982d250b791df3ea3b1e0c1b184e283,

_version: 18,

_score: null,

_source: {

content: \n AWS Certified Solutions Architect – \nAssociate ...,

meta: {

author: Barnosky, Timothy,

date: 2018-02-08T06:13:32.000 0000,

language: en-US,

format: application/pdf; version=1.5,

creator_tool: Microsoft Word 2013,

created: 2018-02-08T06:13:32.000 0000

},

file: {

extension: pdf,

content_type: application/pdf,

created: 2019-04-03T03:31:49.000 0000,

last_modified: 2019-04-03T03:31:49.000 0000,

last_accessed: 2019-06-05T08:08:22.000 0000,

indexing_date: 2019-06-05T08:08:22.479 0000,

filesize: 567176,

filename: AWS_Certified_Solutions_Architect_Associate_Feb_2018_ Exam_Guide_v1.5.2.pdf,

url: file:///Users/caishichao/Documents/AWS/AWS_Certified_Solutions_Architect_Associate_Feb_2018_ Exam_Guide_v1.5.2.pdf

},

path: {

root: 431c7636e585854c841c8e88a25ea39,

virtual: AWS_Certified_Solutions_Architect_Associate_Feb_2018_ Exam_Guide_v1.5.2.pdf,

real: /Users/caishichao/Documents/AWS/AWS_Certified_Solutions_Architect_Associate_Feb_2018_ Exam_Guide_v1.5.2.pdf

}

},

sort: [

-9223372036854776000

]

}

UI上可以通過讀取content,file,path的內容進行必要的展示

具體需要修改buildState.js裡面的內容進行適配。

文件下載

我們可以使用nginx或者其他工具為文件目錄提供一個web訪問的解決方案,當搜索某個關鍵字被匹配後,根據文件信息,構造一個下載路徑,提供文件下載

結語

其實這個博文我沒有寫得特別的詳細,只是簡單的總結一下思路,希望對大家有幫助

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 千鋒JAVA開發學院 的精彩文章:

技術分享:Lamport邏輯時鐘
10個對開發者非常有用的設計原則

TAG:千鋒JAVA開發學院 |