使用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訪問的解決方案,當搜索某個關鍵字被匹配後,根據文件信息,構造一個下載路徑,提供文件下載
結語
其實這個博文我沒有寫得特別的詳細,只是簡單的總結一下思路,希望對大家有幫助
※技術分享:Lamport邏輯時鐘
※10個對開發者非常有用的設計原則
TAG:千鋒JAVA開發學院 |