利用Lucene打造站內搜尋引擎的思路

2021-04-21 02:21:20 字數 956 閱讀 5809

1.為什麼要用lucene,而不用直接從資料庫裡搜尋記錄?

主要是考慮到幾個因素:(1)效能問題,lucene是基於檔案索引的搜尋機制,效能要比資料庫裡檢索更快,特別是資料量大的時候兩者區別比較明顯。資料庫用select檢索時,預設在執行sql語句時,會對錶鎖定,直到查詢完成;(2)目前很多**,都已經將頁面靜態化,這種情況下,直接用生成的檔案編制索引,再利用lucene來檢索,可以不用查詢資料庫,減輕了資料庫的壓力;(3)lucene可以更方便的進行分詞,支援多個關鍵字檢查等操作,在實現上要比sql方便;(4)直接基於檔案系統的檢索,不會有sql注入風險

2.建立索引

基本上有二種思路,適用於不同的情況

(1)如果**本身就是靜態化的,可以直接讀取靜態html檔案,來建立索引。注意:如果要實現特定標籤的搜尋(比如要按產品**,產品編號,產品摘要,發布時間等精確搜尋產品資訊),在讀取檔案內容時,需要利用正規表示式對html檔案進行匹配分析,得到各個標籤的值,再建立field,加入document,最後呼叫indexwriter的相應方法建立索引

(2)也可以直接從資料庫裡查詢各標籤的值,再按(1)的方法,生成field-->document-->加入indexwriter

3.索引的維護

顯然,不可能每次查詢都全部將索引生成一次,這裡的索引維護主要是索引更新和索引刪除,也有兩種思路:

(1)找個訪問比較少的時段,比如每天晚上0點,做乙個c/s程式放在伺服器上,用定時器或計畫任務全部重新生成索引

(2)更合理有效的方式,是當資訊發生修改或刪除時,索引維護程式能得到通知,僅更新特定資訊的索引就可以了。這裡建議用訊息佇列機制,**上有資訊發生增,刪,改時,將唯一標識值,傳送到訊息佇列,然後索引維護程式監聽訊息佇列,一有訊息了,馬上根據唯一標識,到資料庫裡取出修改的資訊(或讀取修改過的html檔案),更新指定索引即可

4.分詞問題

國內有一些公開的分詞元件,可以直接利用,當然有一些是商業化的,要真正好用的,得花一點錢,呵呵

利用Lucene打造站內搜尋引擎的思路

為什麼要用lucene,而不用直接從資料庫裡搜尋記錄?主要是考慮到幾個因素 1 效能問題,lucene是基於檔案索引的搜尋機制,效能要比資料庫裡檢索更快,特別是資料量大的時候兩者區別比較明顯。資料庫用select檢索時,預設在執行sql語句時,會對錶鎖定,直到查詢完成 2 目前很多 都已經將頁面靜態...

站內搜尋 Lucene 盤古分詞

為了方便的學習站內搜尋,下面我來演示乙個mvc專案。1.首先在專案中 新增引入 三個程式集和 dict 資料夾,並新建乙個 分詞內容存放目錄 2.建立search控制器,並轉到index介面寫入如下內容 ps vs有問題,波浪號由他去吧,後台語句 建立索引語句 public actionresult...

mysql站內搜尋 Sphinx站內搜尋

一 sphinx流程 mysql資料 sphinx 索引資料 二 sphinx概述 三 sphinx使用地方 1 中的搜尋 站內搜尋 2 系統後台中的搜尋 四 為什麼要使用sphinx 當資料超過100w時,我們需要使用第三方工具,sphinx。1 做搜尋時當資料量大單純的mysql搜尋比較慢 如果...