這麼說吧,Lucene很簡單,其實就是個框架,用於全文檢索用的
我是風月連城,喜歡用簡單的語言闡述知識點
長期分享原創java文章,分享進階架構師學習筆記及學習資料
喜歡的大屌們可以關注下,共同學習,一起進步
ps:由於工資遲遲不發,影響心情,好幾天沒寫文章....
Lucene是什麼?
0 ) 關鍵詞:Lucene ,搜尋,全文檢索
1)本質:一個Jar包,一個用於全文檢索的框架
2)作用:Lucene不是一個完整的全文索引應用,而是一個用Java寫的全文索引引擎工具包,它可以方便的嵌入到各種應用中實現針對應用的全文索引/檢索功能。而資料庫執行模糊查詢都需要對全表掃描或索引掃描意味著消耗大量IO,如果模糊查詢經常發生,會造成資料庫效能惡化。
3 ) 好處 :
1 . 索引檔案格式獨立於應用平臺。Lucene定義了一套以8位位元組為基礎的索引檔案格式,使得相容系統或者不同平臺的應用能夠共享建立的索引檔案。
2 . 在傳統全文檢索引擎的倒排索引的基礎上,實現了分塊索引,能夠針對新的檔案建立小檔案索引,提升索引速度。然後通過與原有索引的合併,達到優化的目的。
3 . 優秀的面向物件的系統架構,使得對於Lucene擴充套件的學習難度降低,方便擴充新功能。
4 . 設計了獨立於語言和檔案格式的文字分析介面,索引器通過接受Token流完成索引檔案的創立,使用者擴充套件新的語言和檔案格式,只需要實現文字分析的介面。
5 . 已經預設實現了一套強大的查詢引擎,使用者無需自己編寫程式碼即使系統可獲得強大的查詢能力,Lucene的查詢實現中預設實現了布林操作、模糊查詢(Fuzzy Search)、分組查詢等等。
6 . 開源,可擴充套件能力強,有各種語言版本,適合各種平臺,
4 ) 場景:基於Lucene框架的搜尋引擎有很多,如Solr,Elastic Search,Nutch等
5 ) 中文 : 對於中文使用者來說,最關心的問題是其是否支援中文的全文檢索。但通過後面對於Lucene的結構的介紹,你會了解到由於Lucene良好架構設計,對中文的支援只需對其語言詞法分析介面進行擴充套件就能實現對中文檢索的支援。
6 ) 主要的包(既然只是個框架,那肯定得介紹裡面主要的一些包的作用啦):
7 ) 架構設計(Lucene主要做的兩件事):
如圖,簡單說全文檢索大體分兩個過程(主要做這兩件事),索引建立(Indexing)和 搜尋索引(Search)。
一.索引建立入庫:文字內容經切詞後索引入庫 (即通過IndexWriter對不同的檔案進行索引的建立,並將其儲存在索引相關檔案儲存的位置中),其入庫邏輯大致如下:
1.入庫者定義到庫中文件的結構,比如需要把網站內容載入到全文檢索庫,讓使用者通過“站內檢索”搜尋到相關的網頁內容。入庫文件結構與關係型資料庫中的表結構類似,每個入庫的文件由多個欄位構成,假設這裡需要入庫的網站內容包括如下欄位:文章標題、作者、釋出時間、原文連結、正文內容(一般作為網頁快照)。
2. 包含N個欄位的文件(DOCUMENT)在真正入庫前需要經過切詞(或分詞)索引,切詞的規則由語言分析器(ANALYZER)完成。
3. 切分後的“單詞”被註冊到索引樹上,供查詢時用,另外也需要把其它不需要索引的內容入庫,所有這些是檔案操作均由STORAGE完成。
4. Lucene的索引樹結構非常優秀,是Lucene的一大特色。
二.搜尋索引:就是得到使用者的查詢請求,搜尋所建立的索引,然後返回結果的過程。大致邏輯如下:
1. 查詢者輸入查詢條件,條件之間可以通過特定運算子進行運算,比如查詢希望查詢到與“中國”和“北京”相關的記錄,但不希望結果中包括“海淀區中關村”,於是輸入條件為“中國+北京-海淀區中關村”;
2. 查詢條件被傳達到查詢分析器中,分析器將將對“中國+北京-海 澱區中關村”進行分析,首先分析器解析字串的連線符,即這裡的加號和減號,然後對每個詞進行切詞,一般最小的詞元是兩個漢字,則中國和北京兩個詞不必再 切分,但對海淀區中關村需要切分,假設根據切詞演算法,把該詞切分為“海淀區”和“中關村”兩部分,則最後得到的查詢條件可以表示為:“中國” AND “北京” AND NOT(“海淀區” AND “中關村”)。
3.查詢器根據這個條件遍歷索引樹,得到查詢結果,並返回結果集,返回的結果集(類似於JDBC中的ResultSet)
4. 將返回的結果集顯示在查詢結果頁面
5.需要注意的是,Lucene預設只支援英文,為了便於說明問題,以上查詢過程採用中文舉例,事實上,當Lucene被擴充支援中文後就是這麼一個查詢過程。(各種好用的中文詞典分詞庫大家可以自行百度下)
8 ) 原理 : 在Lucene中,就是使用這種“倒排索引”的技術,來實現相關對映。:
9 ) Demo例項 :沒有,就是這麼任性.快國慶了工資都沒發,吃土中...看到這裡的大屌們還不關注下?
相關推薦
這麼說吧,Lucene很簡單,其實就是個框架,用於全文檢索用的
我是風月連城,喜歡用簡單的語言闡述知識點長期分享原創java文章,分享進階架構師學習筆記及學習資料喜歡的大屌們可以關注下,共同學習,一起進步ps:由於工資遲遲不發,影響心情,好幾天沒寫文章....Lucene是什麼?0 ) 關鍵詞:Lucene ,搜尋,全文檢索1)本質:一個Jar包
這麼說吧,NIO很簡單,其實就是個牛逼IO
我是風月連城,喜歡用簡單的語言闡述知識點長期分享原創java文章,分享進階架構師學習筆記及學習資料喜歡的可以點贊關注,共同學習,一起進步0 ) 哈哈,其實我是個標題黨,NIO不是牛逼IO,是非阻塞IONIO 也能算是一種思想,非阻塞IO通訊思想,Netty就是基於NIO思想的NIO框
【轉】如何理解雲計算?很簡單,就像吃貨想吃披薩了
公司 如果 pan 雲技術 cit 分類 本地應用 style 分發 你一定聽說過雲計算中的三個“高大上”的概念:IaaS、PaaS和SaaS。這幾個術語並不好理解。不過,如果你是個吃貨,還喜歡披薩,這個問題就好解決了!好吧,其實你根本不是一個吃貨,之所以自我標榜為
如何理解雲端計算?很簡單,就像吃貨想吃披薩了...
你一定聽說過雲端計算中的三個“高大上”的你一定聽說過雲端計算中的三個“高大上”的概念:IaaS、PaaS和SaaS,這幾個術語並不好理解。不過,如果你是個吃貨,還喜歡披薩,這個問題就好解決了!好吧,其實你根本不是一個吃貨,之所以自我標榜為吃貨,其實是為了收穫讚歎式的誇獎,“吃貨還這麼瘦,好羨慕啊!”或者,總得
這麽說吧,java線程池的實現原理其實很簡單
arr nan ads stop shc 線程異常 fixed 響應 submit 好處 : 線程是稀缺資源,如果被無限制的創建,不僅會消耗系統資源,還會降低系統的穩定性,合理的使用線程池對線程進行統一分配、調優和監控,有以下好處: 1、降低資源消耗; 2、提高響應速度;
SQL註入其實很簡單,別一不留神就被利用了
SQL註入 sqlmap SQL防註入 SQL註入這個詞相信大家應該都不陌生,而且每年都會有這樣子的事情發生,下面我先帶大家回憶11年兩期起比較經典的案例事件: 1、SONY索尼事件2011年4月,著名的×××組織Anonymous***SONY一個網站,一星期後才被發現7千萬的用戶個人信息,其中
除了信號觸發線程與接收者線程相同的情況能直接調用到slot,其它情況都依賴事件機制(解決上面代碼收不到信號的問題其實很簡單,在線程的run();函數中添加一個事件循環就可以了,即加入一句exec();)
使用 usleep tle 結果 線程 方法 params str signal MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
堆其實是個很簡單的資料結構
說到堆這種資料結構,很多人的第一反應是感覺很複雜,其實不然,堆就是個優先順序佇列而已,或者,堆其實就是一種樹。本文先講原理,後面給出堆的實現程式碼。 優先順序佇列可以用有序陣列來實現,這種做法的問題是,儘管刪除最大資料項的時間複雜度為O(1),但是插入還是需要
三、亞馬遜產品定價其實就這麼簡單,一個公式解決
目錄 海貓跨境作者:海貓跨境 2016-11-24 16:33:51 如果產品銷量不好,很多賣家首先想到的是圖片、listing是不是做的不夠好,很少賣家會想想是不是自己的定價有問題,定價對銷量的影響也是至關重要的,定價是一門高深的學問,如果產品
微服務架構springboot讀寫分離這麼難寫麼?我就覺得很簡單
最近在學習Spring boot,寫了個讀寫分離。並未照搬網文,而是獨立思考後的成果,寫完以後發現從零開始寫讀寫分離並不難!我最初的想法是: 讀方法走讀庫,寫方法走寫庫(一般是主庫),保證在Spring提交事務之前確定資料來源.保證在Spring提交事務之前確定資料來源,這個
AngularJS單頁面路由配置恩,理解了就很簡單啦
gif htm con function ner 創建 app 插入 樣式 利用route實現單頁面跳轉功能 利用angularJS開發流程 1)配置好angularJS開發環境 2)利用 yo angular projectname創建項目目錄 3)刪除
將圖片轉換成文字其實很簡單
很多朋友們會在各大論壇或者網站上看到一些比較喜歡的文章或者是文字,但是很多文章會受到版權的限制或者其他的各種原因導致無法直接下載,就得不到自己喜歡的那些文字了。 這裏給大家發一個福利,就是我們的捷速OCR文字識別軟件,只要你把你想要的文字用截屏截成圖片,然後在捷速中進行文字識別,立
手把手教你開發chrome擴展一:開發Chrome Extenstion其實很簡單
evernote 把手 擴展 data文件夾 現在 效果 界面 nag blog 手把手教你開發chrome擴展一:開發Chrome Extenstion其實很簡單 手把手教你開發Chrome擴展二:為html添加行為 手把手教你開發Chrome擴展三:關於本地存儲數據
補碼(為什麽按位取反再加一):告訴你一個其實很簡單的問題
滿足 所有 我們 進位 數字 樂意 如果 二進制 關系 首先,閱讀這篇文章的你,肯定是一個在網上已經糾結了很久的讀者,因為你查閱了所有你能查到的資料,然後他們都會很耐心的告訴你,補碼:就是按位取反,然後加一。準確無誤,毫無破綻。但是,你搜遍了所有俯拾即是而且準確無誤的答
爬蟲很簡單麽?直到我抓取了一千億個網頁後我懂!爬蟲真不簡單!
服務 字體 每日 還需要 道理 但是 電子商務 發表 硬件 現在爬蟲技術似乎是很容易的事情,但這種看法是很有迷惑性的。開源的庫/框架、可視化的爬蟲工具以及數據析取工具有很多,從網站抓取數據似乎易如反掌。然而,當你成規模地在網站上抓東西時,事情很快就會變得非常
別再說SUM函數很簡單,進來看看吧!
exc 多條件 shift 函數 單條件 log ctrl blog 單元格 條件求和 單條件求和 如下圖,統計A產品的銷量總和,輸入公式:=SUM((A2:A6="A")*(C2:C6))按Ctrl+Shift+Enter組合鍵即可。 多條件求和 統計
漢諾塔問題其實很簡單
推出 class 回溯思想 除了 source 問題 容易 假設 為我 首先上代碼 1 def hanoi_move(n, source, dest, intermediate): 2 if n >= 1: # 遞歸出口,只剩一個盤子 3
面向物件程式設計其實很簡單——Python 面向物件(初級篇)
概述 面向過程:根據業務邏輯從上到下寫壘程式碼 函式式:將某功能程式碼封裝到函式中,日後便無需重複編寫,僅呼叫函式即可 面向物件:對函式進行分類和封裝,讓開發“更快更好更強...” 面向過程程式設計最易被初學者接受,其往往用一長段程式碼來實現指定功能,開發過
shell程式設計其實真的很簡單(一)
如今,不會Linux的程式設計師都不意思說自己是程式設計師,而不會shell程式設計就不能說自己會Linux。說起來似乎shell程式設計很屌啊,然而不用擔心,其實shell程式設計真的很簡單。 背景 什麼是shell程式設計 高大上的解釋,往往讓人摸不住頭腦。一句話概括就是:shell
shell程式設計其實真的很簡單(二)
上篇我們學會了如何使用及定義變數。按照尿性,一般接下來就該學基本資料型別的運算了。 沒錯,本篇就仍是這麼俗套的來講講這無聊但又必學的基本資料型別的運算了。 基本資料型別運算 操作符 符號 語義 描述 + 加 10+10,結果為20 - 減 10-3, 結果為7 * 乘 10*2,結果