Java 的開放原碼全文搜尋技術 - Lucene

63
Java 的開放原碼全文搜尋技術 - Lucene 作者: 王建興 /Chien-Hsing Wang [email protected]

description

簡介 Java-based 的全文搜尋引擎 Lucene 的概念及基本實作

Transcript of Java 的開放原碼全文搜尋技術 - Lucene

Page 1: Java 的開放原碼全文搜尋技術 - Lucene

Java 的開放原碼全文搜尋技術- Luc e ne

作者:

王建興 /Chien-Hsing Wang

[email protected]

Page 2: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

個人簡介

清大資工博士候選人研究興趣

● Distributed Network Management System● Mobile Code System● Peer-to-Peer System

●開發興趣● J2EE-based System

●Qing● “ching”

Page 3: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

概要

●全文搜尋引擎簡介●Lucene 簡介與程式設計●Lucene 應用實例-圖檔管理●相關資源

Page 4: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

全文搜尋引擎簡介

●為何需要全文搜尋引擎●全文搜尋引擎的基本概念

Page 5: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

為何需要全文搜尋引擎?

●你今天 Google 了嗎?● Google 大神無所不在,日日焚香禱祝,便可受其庇

祐●企業的文件中心

● 文件資料電子化程度高,數量又龐大●個人的數位資料管理

Page 6: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

全文搜尋引擎技術

給定一小段字詞,搜尋含有該字詞的文件作法一: String Matching Algorithm

所有的文件內容都需保留 搜尋速度在規模提升後會衰退的很快

作法二: Index-based Method

Page 7: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

全文搜尋流程

索引

排名查詢

輸入查詢條件

文件預先的處理

查詢結果

Page 8: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

全文搜尋的查詢

●自然語言● ” 我要找出教 Java 程式設計的文章”

●布林運算表示● “Java” and “ 程式設計”

Page 9: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

全文搜尋中預先的處理動作

●依文件格式解出文件中的文字部份● 例如: Word, PDF, HTML, etc…

●斷字斷詞● 東西大不同

●建索引

Page 10: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

文件的結構化表示

王森是個好人

文件 1

王建興,也是個好人

文件 2

2好人......

2王建興2王建1好人1森是個

......1王森是個1王森是1王森

文件號詞

Page 11: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

索引表示- Vector Space

251004

110103

1003102

420031

詞 5詞 4詞 3詞 2詞 1文件號

Page 12: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

索引表示- Inverted Index (1/3)

2114詞 5

5102詞 4

1000詞 3

0130詞 2

00103詞 1

文件 4文件 3文件 2文件 1詞

Page 13: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

索引表示- Inverted Index (2/3)

41詞 5

12詞 5

13詞 5

54詞 4

13詞 4

13詞 2

102詞 1

24詞 5

21詞 4

54詞 3

32詞 2

31詞 1

頻率文件號詞

Page 14: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

索引表示- Inverted Index (3/3)

83詞 484詞 5

51詞 342詞 2

132詞 1總頻率文件數詞

411213

5413

13

102

24

2154

32

31頻率文件號

Page 15: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

索引式方法 VS. Like

●RDMS 的 like , DB 的索引是起不了作用的

● 僅用 GREP 式的搜尋●like 不具斷詞的比對效果

● Like def% 有可能找出 definition 與 definite●like 不能提供比對結果的好壞指標

● 不具衡量相似性的能力

Page 16: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Lucene 簡介與程式設計

●Lucene 簡介●Lucene 程式設計

Page 17: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Lucene …是

• Lucene 是個高效能的全文搜尋引擎• 100% Pure Java

– 跨平台!

• 目前是 Jakarta Project 的一部份– Open Source– Free

Page 18: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Lucene 的作者與歷史

• 作者 : Doug Cutting– V-Twin 搜尋引擎的首席開發

者– Excite 的資深系統架構師

• 歷史沿革– www.lucene.com– sourceforge.net/projects/lucene– jakarta.apache.org/lucene

Page 19: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Powered By Lucene

Page 20: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Powered by Lucene – Jute

Page 21: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Powered by Lucene – 博客中國

Page 22: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Powered by Lucene – 焦點網狂搜

Page 23: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Lucene 的主要特色

●提供高效能的索引機制●提供布林運算查詢●提供查詢結果的排名( ranking)與評分●跨平台●開放易用的 API●極易擴充,客製

Page 24: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Lucene 做為全文搜尋引擎的優點(1/2)●支援遞增式的索引

●毋需每次重建索引,即使只增加一點資料●不侷限在特定型態的資料來源

● 例如 HTML● 可自行剖析不同的資料來源,轉化成可供 Lucene

處理的文件類別●文件的多欄索引控制

● 可將文件劃分為多個欄位●每個欄位都可進行不同的索引控制,例如斷詞與否

Page 25: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Lucene 做為全文搜尋引擎的優點(2/2)●提供通用的文件分析能力

● 可自訂文件分析的方式● 標準支援 CJK 與阿拉伯語言等非拉丁語系的語言

●提供通用的查詢分析能力● 可自訂查詢的語法

Page 26: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Lucene 的安裝與建置

●自 Lucene官方網站取得● Binaries :直接可用● Source Code :需自行編譯

●毋需額外的其他 Third Party 程式庫●將 library 檔置於 CLASSPATH 中

● lucene-{version}.jar ●就是這麼簡單!

Page 27: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Lucene 的基本架構

Index

Query String

Query

Searcher

IndexWriter.addDocument()

Document

Document

Document QueryParser.parse()

DocumentField1(name, value)Field2(name, value)

….Keyword1(name, value)

….

Page 28: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Lucene 中的文件( Document)

●每份文件皆被對應至一文件號( document number)●文件是由一組欄位所構成

●每個欄位皆為 name:value● 例如:

● document.add(Field.Text(“title”, “ 我想當個好人” ));● document.add(Field.Keyword(“author”, “ 王森” ));● document.add(Field.Text(“content”, “從前我還是個好人的時候…” ));

Page 29: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Lucene 中的欄位( Field) 1/2

●具三種可能的特質● Stored :整個欄位值存入,不做索引,只供日後之

需● Indexed :欄位值會被索引以利搜尋之用● Tokenized : Tokenized 的欄位也必須是

Indexed ,這代表此欄位的內容會先經過斷詞的程序

Page 30: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Lucene 中的欄位( Field) 2/2

●對應至 Field類別的不同方法●各有不同的應用時機

●省空間不用 Stored欄位● 有些欄位毋需斷詞,例如作者

Page 31: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Field應用實例

●文件中心中的文件有下述欄位● 檔案位置 ( Stored )● 作者 ( Indexed )● 文件時間 ( Stored )● 文件標題 (Tokenized, Stored )● 文件內容 ( Tokenized )

Page 32: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Field類別的不同方法

N

Y

Y

N

Y

儲存

文件內容YYField.UnStored(String name, String value)

檔案位置檔案時間

NNField.UnIndexed(String name, String value)

作者YNField.Keyword(String name, String value)

文件內容YYField.Text(String name, Reader value)

文件標題YYField.Text(String name, String value)

例索引斷詞方法

Page 33: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Field 不存在的性質組合

N

N

Y

儲存

索引等於儲存斷詞必索引斷詞必索引

不存在的原因

YN

NY

NY

索引斷詞

Page 34: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Lucene 中的分析器( Analyzer)

●用於斷詞● 查詢文字條件● 文件內容

●深深影響索引與搜尋的品質●有多種預設類型

● WhileSpaceAnalyzer● SimpleAnalyzer● StopAnalyzer● StandardAnalyzer

●可自訂自己的分析器

Page 35: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Tokenizer和 Filter 的作用

●Tokenizer●被 Analyzer 用來把一連串的文字斷成” token”● This is a book -> “This” “is” “a” “book”

●Filter● 對 tokenized 後的 token進行加工● “This” “is” “a” “book” -> “this” “book”

●Analyzer 可能用到一個以上的 Tokenizer●但不一定會用到 Filter

Page 36: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

各分析器的差異 (1/2)

●WhileSpaceAnalyzer● WhilespaceTokenizer

●SimpleAnalyzer● LetterTokenizer● LowerCaseFilter

●StopAnalyzer● LetterTokenizer● LowerCaseFilter+StopFilter

Page 37: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

各分析器的差異 (2/2)

●StandardAnalyzer● StandardTokenizer● StandrdFilter+LowerCaseFilter+StopFilter

Page 38: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Lucene 程式設計

●加入文件● 文字解析● 建立索引

●搜尋文件● 搜尋

●實例說明

Page 39: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

加入文件

●文字解析●針對不同格式取出其文字部份

●建立索引●利用 StandardAnalyzer來分析文件內容●利用 Document 與 Field來輸入文件●利用 IndexWriter來寫入索引

Page 40: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

加入文件 - 文字解析

WordExtractor extractor = new WordExtractor();FileInputStream fis = new FileInputStream(f);text = extractor.extractText(fis);fis.close();

使用 o rg .te xtm in ing .te xt.e xtrac tio n .Wo rd Extrac to r

Page 41: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

加入文件 - 建立索引

IndexWriter writer = new IndexWriter(indexPath, new StandardAnalyzer(), true);Document doc = new Document();doc.add(Field.UnIndexed("path", file.getCanonicalPath()));doc.add(Field.Text("text", text));writer.addDocument(doc);writer.close();

Page 42: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

搜尋文件

●對索引進行搜尋●利用 StandardAnalyzer來分析查詢條件●利用 QueryParser來建立 Query物件●利用 IndexSearcher來對索引進行搜尋●利用 Hits來取得搜尋結果

Page 43: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

搜尋文件 - 搜尋

Searcher searcher = new IndexSearcher(indexPath);Query query = QueryParser.parse(queryString, "text", new StandardAnalyzer());Hits hits = searcher.search(query);

Page 44: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

搜尋文件 -取得搜尋結果

for(int i=0; i<hits.length(); i++){

System.out.println("File:“ +hits.doc(i).get("path"));

System.out.println("\tScore:“ +hits.score(i));}

Page 45: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Lucene 中的查詢語法

●查詢是由詞和運算子所組成●所謂的詞( term)即為單一個字詞

● “Hello”●所謂的詞組( phrase)則是由雙引號所括住的多個字詞

● “Hello World”●多詞可經由運算子相連接形成複雜的查詢

Page 46: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

欄位查詢

●“text”欄位是預設的欄位●title:"The Right Way" AND text:go ●title:"Do it right" AND right●title:Do it right

Page 47: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

詞之修飾子 (1/2)

●萬元字元 ? 與 *● te?t ● test*

●模糊查詢● 基於 Levenshtein Distance或 Edit Distance演算法●將 ~置於單一字詞之末● roam~ 可能找出 foam和 roams

Page 48: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

詞之修飾子 (2/2)

●相近搜尋● 搜尋的字組之間的距離不超過指定的範圍● "jakarta apache"~10

●範圍搜尋● 基於字串順序● mod_date:[20020101 TO 20030101] ● title:{Aida TO Carmen}

Page 49: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

布林運算子 (1/2)

●OR● "jakarta apache" jakarta● "jakarta apache" OR jakarta

●AND● "jakarta apache" AND "jakarta lucene“

●+ ,也稱為 required 運算子●必須要存在● +jakarta apache

Page 50: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

布林運算子 (2/2)

●NOT● "jakarta apache" NOT "jakarta lucene" ● NOT “jakarta apache” <- 不 work

●- ,也稱 prohibit 運算子● 不能存在● "jakarta apache" -"jakarta lucene"

Page 51: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Lucene 與中文

●中文有不同於拉丁語系的斷詞特殊性● 自動斷詞● 詞庫斷詞

●Lucene 目前標準已支援中文

Page 52: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Lucene 的客製能力

●查詢語法●查詢物件的建立●斷詞,詞的過濾●相似性 (Ranking)

Page 53: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

進階議題

●如何處理索引內容的變動●刪除已索引的文件●縮小索引檔的大小●進階的查詢動作●調整參數以提昇索引效能●於記憶體中進行索引,達到加速的目的

Page 54: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

索引的變動

●重新索引●太耗時,不經濟

●先刪後增●刪去變動前的文件●新增變動後的文件

Page 55: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

刪除文件的方式

●利用 IndexReader 的 delete()●delete(int)

●已知文件號●delete(Term)

● 例如已知檔案路徑

Page 56: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

索引最佳化

●利用 IndexWriter 的 optimize()方法●可壓縮索引資料庫,並提供查詢速度●在大量批次索引後可為之●毋需每次遞增索引後進行

Page 57: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

取得Query物件的方式

●Direct Query Parsing●利用 QueryParser將查詢字串轉為 Query物件

●Indirect Query Parsing●將使用者的輸入(受限的)轉為查詢字串,再透過

Direct Query Parsing取得 Query物件●Query Construction

● 自己建構 Query物件●最麻煩但最有彈性

Page 58: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

提高 Lucene 的索引效能

●Indexing Speed Factors● IndexWriter.mergeFactor

● 多少文件索引完後會從 memory被寫會 disk● 也關係到多個 segment 中的文件數量達到多少時,會被合併成

一個 segment● 例如: mergeFactor 為 10● 10 個文件被寫成一個 segement● 當出現第 10 個 size 為 10 的 segment時,會被合併成一個 size

為 100 的 segment● IndexWriter.maxMergeDocs

● 單一 segment 中的文件最大量● 預設為 Integer.MAX_VALUE

Page 59: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

In-Memory Indexing

RAMDirectory ramDir = new RAMDirectory();IndexWriter ramWriter = new IndexWriter(ramDir, analyzer, true);……IndexWriter fsWriter = new IndexWriter(indexDir, analyzer, true);fsWriter.addIndexes(new Directory[] { ramDir });ramWriter.close();fsWriter.close();

Page 60: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

WebLucene :網站站內搜尋

●中國車東 (chedong) 先生所開發●可為 Web Site 提供站內的全文搜尋機制●當然是 Apache Software License●http://sourceforge.net/projects/weblucene

Page 61: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Resources (1/2)

●Project● http://jakarta.apache.org/lucene/docs/index.html● [email protected][email protected]

●Index Format● http://jakarta.apache.org/lucene/docs/fileformats.html

●Introduction● http://today.java.net/pub/a/today/2003/07/30/LuceneIntro.ht

ml

Page 62: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會

Resources (2/2)

●Advanced Text Indexing with Lucene● http://www.onjava.com/pub/a/onjava/2003/03/05/lu

cene.html

Page 63: Java 的開放原碼全文搜尋技術 - Lucene

2004 Java2 專業技術大會