Lucene簡介
1.什么是Lucene
Lucene是一個全文搜索框架,而不是應用產品。因此它并不像http://www.baidu.com/ 或者google Desktop那么拿來就能用,它只是提供了一種工具讓你能實現這些產品。
2.Lucene能做什么?
要回答這個問題,先要了解lucene的本質。實際上lucene的功能很單一,說到底,就是你給它若干個字符串,然后它為你提供一個全文搜索服務,告訴你你要搜索的關鍵詞出現在哪里。知道了這個本質,你就可以發揮想象做任何符合這個條件的事情了。你可以把站內新聞都索引了,做個資料庫;你可以把一個數據庫表的若干個字段索引起來,那就不用再擔心因為“%like%”而鎖表了;你也可以寫個自己的搜索引擎……
3.Lucene的性能表現
- 測試一:250萬記錄,300M左右文本,生成索引380M左右,800線程下平均處理時間300ms。
- 測試二:37000記錄,索引數據庫中的兩個varchar字段,索引文件2.6M,800線程下平均處理時間1.5ms
4.Lucene性能表現好的原因
- 倒排索引
- 壓縮算法
- 二元搜索
5.倒排索引
- 根據屬性的值來查找記錄。這種索引表中的每一項都包括一個屬性值和具有該屬性值的各記錄的地址。由于不是由記錄來確定屬性值,而是由屬性值來確定記錄的位置,因而稱為倒排索引(invertedindex)
- 單詞-文件矩陣
6.Lucene工作方式
lucene提供的服務實際包含兩部分:一入一出。所謂入是寫入,即將你提供的源(本質是字符串)寫入索引或者將其從索引中刪除;所謂出是讀出,即向用戶提供全文搜索服務,讓用戶可以通過關鍵詞定位源
- 寫入流程
源字符串首先經過analyzer處理,包括:分詞,分成一個個單詞;去除stopword(可選---就是你想屏蔽的詞)。
將源中需要的信息加入Document的各個Field中,并把需要索引的Field索引起來,把需要存儲的Field存儲起來。
將索引寫入存儲器,存儲器可以是內存或磁盤。
- 讀出流程
用戶提供搜索關鍵詞,經過analyzer處理。
對處理后的關鍵詞搜索索引找出對應的Document。
用戶根據需要從找到的Document中提取需要的Field。
- document
用戶提供的源是一條條記錄,它們可以是文本文件、字符串或者數據庫表的一條記錄等等。一條記錄經過索引之后,就是以一個Document的形式存儲在索引文件中的。用戶進行搜索,也是以Document列表的形式返回。
- field
一個Document可以包含多個信息域,例如一篇文章可以包含“標題”、“正文”、“最后修改時間”等信息域,這些信息域就是通過Field在Document中存儲的。
Field有兩個屬性可選:存儲和索引。通過存儲屬性你可以控制是否對這個Field進行存儲;通過索引屬性你可以控制是否對該Field進行索引。這看起來似乎有些廢話,事實上對這兩個屬性的正確組合很重要
- 使用Lucene建立倒排索引文件
- 導入lucene 相關jar包
- 調用相關java API生成索引