Lucene公司學(xué)習(xí)培訓(xùn)_第1頁
Lucene公司學(xué)習(xí)培訓(xùn)_第2頁
Lucene公司學(xué)習(xí)培訓(xùn)_第3頁
Lucene公司學(xué)習(xí)培訓(xùn)_第4頁
Lucene公司學(xué)習(xí)培訓(xùn)_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、LuceneLucene交流一交流一2012.5目錄搜索引擎簡介搜索引擎簡介Lucene 簡介簡介Lucene原理原理Lucene應(yīng)用實例應(yīng)用實例搜索引擎搜索引擎是指根據(jù)一定的策略、運用特定的計算機程序從互聯(lián)網(wǎng)上搜集信息,在對信息進行組織和處理后,為用戶提供檢索服務(wù),將用戶檢索相關(guān)的信息展示給用戶的系統(tǒng)。搜索引擎包括全文索引、目錄索引、元搜索引擎、垂直搜索引擎、集合式搜索引擎、門戶搜索引擎與免費鏈接列表等。全文搜索引擎是名副其實的搜索引擎,國外代表有Google,國內(nèi)則有著名的百度。它們從互聯(lián)網(wǎng)提取各個網(wǎng)站的信息(以網(wǎng)頁文字為主),建立起數(shù)據(jù)庫,并能檢索與用戶查詢條件相匹配的記錄,按一定的排列

2、順序返回結(jié)果。全文檢索:數(shù)據(jù)的存儲有結(jié)構(gòu)化和非結(jié)構(gòu)化的。結(jié)構(gòu)化:數(shù)據(jù)庫、元數(shù)據(jù)等非結(jié)構(gòu)化:郵件,網(wǎng)頁內(nèi)容,word.全文檢索的思路:將非結(jié)構(gòu)化的一部分信息提取出來重新組織變成一定結(jié)構(gòu)(索引)提高收搜速度。因此,全文檢索就是按特定的數(shù)據(jù)存儲格式先建立索引,再對索引進行搜索的過程。Lucene 簡介Lucene是非常優(yōu)秀的成熟的開源的免費的純java語言的全文索引檢索工 具包。Lucene是一個高性能、可伸縮的信息搜索(IR)庫,即它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構(gòu),提供了完整的查詢引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語言)。Information Retri

3、eval (IR) library.它使你可以為你的應(yīng)用程序添加索引和搜索能力。Lucene的作者Doug Cutting是資深的全文索引/檢索專家,最開始發(fā)布在他本人的主頁上,2001年10月貢獻(xiàn)給APACHE,成為APACHE基金的一個子項目。 /lucene/ Lucene是一個IR庫而不是現(xiàn)成的產(chǎn)品,當(dāng)然也不是Lucene的初識者常常認(rèn)為的web爬行器為什么要選擇LuceneLucene作為一個全文檢索引擎,其具有如下突出的優(yōu)點:(1)索引文件格式獨立于應(yīng)用平臺。Lucene定義了一套以8位字節(jié)為基礎(chǔ)的索引文件格式,使得兼容系統(tǒng)或者不同平

4、臺的應(yīng)用能夠共享建立的索引文件。(2)在傳統(tǒng)全文檢索引擎的倒排索引倒排索引的基礎(chǔ)上,實現(xiàn)了分塊索引,能夠針對新的文件建立小文件索引,提升索引速度。然后通過與原有索引的合并,達(dá)到優(yōu)化的目的。(3)優(yōu)秀的面向?qū)ο蟮南到y(tǒng)架構(gòu),使得對于Lucene擴展的學(xué)習(xí)難度降低,方便擴充新功能。(4)設(shè)計了獨立于語言和文件格式的文本分析接口,索引器通過接受Token流完成索引文件的創(chuàng)立,用戶擴展擴展新的語言和文件格式,只需要實現(xiàn)文本分析的接口。(5)已經(jīng)默認(rèn)實現(xiàn)了一套強大的查詢引擎查詢引擎,用戶無需自己編寫代碼即使系統(tǒng)可獲得強大的查詢能力,Lucene的查詢實現(xiàn)中默認(rèn)實現(xiàn)了布爾操作、模糊查詢(Fuzzy Sear

5、ch)、分組查詢等等。開源,可擴展能力強可擴展能力強,有各種語言版本,適合各種平臺,目錄搜索引擎簡介搜索引擎簡介Lucene 簡介簡介Lucene原理原理Lucene應(yīng)用實例應(yīng)用實例現(xiàn)代搜索引擎的核心對要搜索的文件建立索引在索引基礎(chǔ)上搜索Lucene搜索機制-A 建立索引Lucene 采用反向索引(inverted index)機制通過實現(xiàn)特定API,完成文檔建立索引的工作Lucene搜索機制-B 基于索引搜索Lucene通過特定的類,可以對索引進行操作通過特定的類,封裝搜索結(jié)果,供應(yīng)用程序處理Lucene系統(tǒng)結(jié)構(gòu)Lucene包結(jié)構(gòu)功能表包結(jié)構(gòu)功能表包名功能org.apache.lucene.

6、analysis語言分析器,主要用于的切詞,支持中文主要是擴展此類org.apache.lucene.document索引存儲時的文檔結(jié)構(gòu)管理,類似于關(guān)系型數(shù)據(jù)庫的表結(jié)構(gòu)org.apache.lucene.index索引管理,包括索引建立、刪除等org.apache.lucene.queryParser查詢分析器,實現(xiàn)查詢關(guān)鍵詞間的運算,如與、或、非等org.apache.lucene.search檢索管理,根據(jù)查詢條件,檢索得到結(jié)果org.apache.lucene.store數(shù)據(jù)存儲管理,主要包括一些底層的I/O操作org.apache.lucene.util一些公用類Lucene的主要邏

7、輯圖的主要邏輯圖 Lucene功能強大,但從根本上說,主要包括兩塊: 一是文本內(nèi)容經(jīng)切詞后索引入庫; 二是根據(jù)查詢條件返回結(jié)果入庫邏輯入庫邏輯1.入 庫者定義到庫中文檔的結(jié)構(gòu),比如需要把網(wǎng)站內(nèi)容加載到全文檢索庫,讓用戶通過“站內(nèi)檢索”搜索到相關(guān)的網(wǎng)頁內(nèi)容。入庫文檔結(jié)構(gòu)與關(guān)系型數(shù)據(jù)庫中的表結(jié)構(gòu)類 似,每個入庫的文檔由多個字段每個入庫的文檔由多個字段構(gòu)成構(gòu)成,假設(shè)這里需要入庫的網(wǎng)站內(nèi)容包括如下字段:文章標(biāo)題、作者、發(fā)布時間、原文鏈接、正文內(nèi)容(一般作為網(wǎng)頁快照)。2.包含N個字段的文檔(DOCUMENT)在真正入庫前需要經(jīng)過切詞在真正入庫前需要經(jīng)過切詞(或分詞)索引,切詞的規(guī)則由語言分析器(ANA

8、LYZER)完成。3.切分后的“單詞”被注冊到索引樹上,供查詢時用,另外也需要把其它不需要索引的內(nèi)容入庫,所有這些是文件操作均由STORAGE完成。4.Lucene的索引樹結(jié)構(gòu)非常優(yōu)秀,是Lucene的一大特色。查詢邏輯查詢邏輯1.查詢器根據(jù)條件遍歷索引樹,得到查詢結(jié)果,并返回結(jié)果集,返回的結(jié)果集類似于JDBC中的ResultSet。2.將返回的結(jié)果集顯示在查詢結(jié)果頁面,當(dāng)點擊某一條內(nèi)容時,可以鏈接到原始網(wǎng)頁,也可以打開全文檢索庫中存儲的網(wǎng)頁內(nèi)容。3.這就是查詢的邏輯過程,需要說明的是,Lucene默認(rèn)只默認(rèn)只支持英文支持英文,為了便于說明問題,以上查詢過程采用中文舉例,事實上,當(dāng)Lucene

9、被擴充支持中文后就是這么一個查詢過程。Lucene數(shù)據(jù)結(jié)構(gòu)與DB類比理解核心索引類 為了對文檔進行索引,Lucene 提供了五個基礎(chǔ)的類 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.apache.lucene.store.Directory public abstract class Analyzer org.apache.lucene.analysis.Analyzer public final class Document org.apach

10、e.lucene.document.Document public final class Field org.apache.lucene.document.Field IndexWriter IndexWriter是在索引過程中的中心組件。 IndexWriter這個類創(chuàng)建一個新的索引并且添加文檔到一個已有的索引中。你可以把你可以把IndexWriter想象成讓你可以對索想象成讓你可以對索引進行寫操作的對象引進行寫操作的對象,但是不能讓你讀取或搜索。 IndexWriter不是唯一的用來修改索引的類 org.apache.lucene.index.IndexWriter public Ind

11、exWriter(String path, Analyzer a, boolean create) Parameters:path - the path to the index directorya - the analyzer to usecreate - true to create the index or overwrite the existing one; false to append to the existing index Directory Directory類代表一個Lucene索引的位置。它是一個抽象類. 其中的兩個實現(xiàn): 第一個是 FSDirectory,它表示一

12、個存儲在文件系統(tǒng)中的索引的位置。 第二個是 RAMDirectory,它表示一個存儲在內(nèi)存當(dāng)中的索引的位置。 Analyzer 在一個文檔被索引之前,首先需要對文檔內(nèi)容進行分詞處理,并且而剔除一些冗余的詞句(例如:a,the,they等),這部分工作就是由 Analyzer 來做的。 Analyzer 類是一個抽象類,它有多個實現(xiàn)。BrazilianAnalyzer, ChineseAnalyzer, CJKAnalyzer, CzechAnalyzer, DutchAnalyzer, FrenchAnalyzer, GermanAnalyzer, GreekAnalyzer, Keyword

13、Analyzer, PatternAnalyzer, PerFieldAnalyzerWrapper, RussianAnalyzer, SimpleAnalyzer, SnowballAnalyzer, StandardAnalyzer, StopAnalyzer, ThaiAnalyzer, WhitespaceAnalyzer 針對不同的語言和應(yīng)用需要選擇適合的 Analyzer。Analyzer 把分詞后的內(nèi)容交給 IndexWriter 來建立索引。 Document org.apache.lucene.document.Document Document文檔類似數(shù)據(jù)庫中的一條記錄,

14、可以由好幾個字段(Field)組成,并且字段可以套用不同的類型。 一個Field代表與這個文檔相關(guān)的元數(shù)據(jù)。元數(shù)據(jù)如作者、標(biāo)題、主題、修改日期等等,分別做為文檔的字段索引和存儲。 Document的方法: void add(Fieldable field)添加一個字段(Field)到Document中 String get(String name)從文檔中獲得一個字段對應(yīng)的文本FieldField 對象是用來描述一個文檔的某個屬性的,比如一封電子郵件的對象是用來描述一個文檔的某個屬性的,比如一封電子郵件的標(biāo)題和內(nèi)容可以用兩個標(biāo)題和內(nèi)容可以用兩個 Field 對象分別描述。對象分別描述。 Fie

15、ld(String name, byte value, Field.Store store) Create a stored field with binary value.Field(String name, Reader reader) Create a tokenized and indexed field that is not stored.Field(String name, Reader reader, Field.TermVector termVector) Create a tokenized and indexed field that is not stored, opt

16、ionally with storing term vectors.Field(String name, String value, Field.Store store, Field.Index index) Create a field by specifying its name, value and how it will be saved in the index.Field(String name, String value, Field.Store store, Field.Index index, Field.TermVector termVector) Create a fie

17、ld by specifying its name, value and how it will be saved in the index.Field(String name, TokenStream tokenStream) Create a tokenized and indexed field that is not stored.Field(String name, TokenStream tokenStream, Field.TermVector termVector) Create a tokenized and indexed field that is not stored,

18、 optionally with storing term vectors.靜態(tài)內(nèi)部類Field.Index 表示Field的索引方式NO 表示該Field不需要索引,也就是用戶不需要去查找該Field的值A(chǔ)NALYZED 表示該Field先被分詞再索引NOT_ANALYZED 不對該Field進行分詞,但會對它進行索引,像鏈接地址URL、文件系統(tǒng)路徑信息、時間日期、人名、居民身份證、電話號碼等等通常將被索引并且完整的存儲在索引中,但一般不需要切分詞NOT_ANALYZED_NO_NORMS 表示對該Field進行索引,但是不使用Analyzer,同時禁止它參加評分,主要是為了減少內(nèi)存的消耗A

19、NALYZED_NO_NORMS 對該Field進行索引,但是使用Analyzer,同時禁止它參加評分,主要是為了減少內(nèi)存的消耗。Field.Store 表示Field的存儲方式, store類有3個公有的靜態(tài)屬性:COMPRESS表示用壓縮方式來保存這個Field的值NO 原文不存儲在索引文件中,搜索結(jié)果命中后,再根據(jù)其他附加屬性如文件的Path,數(shù)據(jù)庫的主鍵等,重新連接打開原文,適合原文內(nèi)容較大的情況。 YES表示該Field需要存儲new Field(FIELD_NAME, content, Field.Store.YES,Field.Index.ANALYZED);創(chuàng)建一個索引的大致過

20、程 Analyzer analyzer = new PaodingAnalyzer(); /讀取本類目錄下的text.txt文件 String content = ContentReader.readText(Chinese.class); Directory ramDir = new RAMDirectory(); IndexWriter writer = new IndexWriter(ramDir, analyzer, MaxFieldLength.UNLIMITED); Document doc = new Document(); Field fd = new Field(FIELD_

21、NAME, content, Field.Store.YES,Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS); doc.add(fd); writer.addDocument(doc); writer.optimize(); writer.close();理解核心搜索類 只需要幾個類來執(zhí)行基本的搜索操作: public class IndexSearcherorg.apache.lucene.search.IndexSearcher extends Searcher public final class Termor

22、g.apache.lucene.index.Term public abstract class Query org.apache.lucene.search.Query public class TermQueryorg.apache.lucene.search.TermQuery extends Query public final class Hits org.apache.lucene.search.Hits IndexSearcher IndexSearcher是用來在建立好的索引上進行搜索的 它只能以只讀的方式打開一個索引,所以可以有多個IndexSearcher的實例在一個索引上

23、進行操作。 它提供幾個搜索方法,其中一些在抽象基類Searcher中實現(xiàn);Search方法 返回值為Hits型的對象: public final Hits search(Query query) throws IOException Returns the documents matching query. public Hits search(Query query, Filter filter) throws IOException Returns the documents matching query and filter. public Hits search(Query query

24、, Sort sort) throws IOException Returns documents matching query sorted by sort. public Hits search(Query query, Filter filter, Sort sort) throws IOException Returns documents matching query and filter, sorted by sort.關(guān)于Term Term是搜索的基本單元搜索的基本單元。一個Term對象有兩個String類型的域組成:字段的名稱和字段的值。 在搜索時,你可能創(chuàng)建Term對象并和T

25、ermQuery同時使用。其中第一個參數(shù)代表了要在文檔的哪一個Field上進行查找,第二個參數(shù)代表了要查詢的關(guān)鍵詞。 Query q = new TermQuery(new Term(“fieldName”, “queryWord ”); Hits hits = sercher.search(q); 這段代碼使Lucene找出在fieldName字段中含有單詞queryWord的所有文檔。因為TermQuery對象繼承自它的抽象父類Query。Query Query是一個抽象類,這個類的目的是把用戶輸入的查詢字符串封裝成Lucene能夠識別的Query。 Lucene中包含一些Query的具體

26、子類。 Direct Known Subclasses: BooleanQuery, BoostingQuery, ConstantScoreQuery, ConstantScoreRangeQuery, CustomScoreQuery, DisjunctionMaxQuery, FilteredQuery, FuzzyLikeThisQuery, MatchAllDocsQuery, MoreLikeThisQuery, MultiPhraseQuery, MultiTermQuery, PhraseQuery, PrefixQuery, RangeQuery, SpanQuery, Te

27、rmQuery, ValueSourceQueryTermQuery TermQuery是抽象類Query的一個子類,它同時也是Lucene支持的最為基本的一個查詢類。 生成一個TermQuery對象由如下語句完成: 它的構(gòu)造函數(shù)只接受一個參數(shù),那就是一個Term對象。TermQuery termQuery = new TermQuery(new Term(“fieldName”,”queryWord”);Hits Hits是用來保存搜索的結(jié)果的。 基于性能考慮,Hits的實例并不從索引中加載所有匹配查詢的所有文檔,而是每次一小部分。 public final int length() pub

28、lic final Document doc(int n) public final float score(int n) public final int id(int n) public Iterator iterator() 關(guān)鍵詞搜索的大致過程 最簡單的接受單個Query對象做為參數(shù)并返回一個Hits對象。這個方法的典型應(yīng)用類似這樣:IndexSearcher sercher = new IndexSearcher( INDEX_DIR); Query q = new TermQuery(new Term(“contents”, “l(fā)ucene”); Hits hits = serch

29、er.search(q); for (int i = 0; i hits.length(); i+) Document doc = hits.doc(i);String summary = doc.get(“title);BooleanQuery布爾搜索 BooleanQuery是實際開發(fā)過程中經(jīng)常使用的一種Query。 它其實是一個組合的Query,在使用時可以把各種Query對象添加進去并標(biāo)明它們之間的邏輯關(guān)系。 BooleanQuery是可以嵌套的(BooleanQuery是一個布爾子句的容器) 一個BooleanQuery可以成為另一個BooleanQuery的條件子句。 布爾型Que

30、ry的子句數(shù)目不能超過1024BooleanClause布爾搜索public void add(Query query, BooleanClause.Occur occur)BooleanClause用于表示布爾查詢子句關(guān)系的類,包括: BooleanClause.Occur.MUST,BooleanClause.Occur.MUST_NOT,BooleanClause.Occur.SHOULD。有以下6種組合: 1MUST和MUST:取得連個查詢子句的交集。 2MUST和MUST_NOT:表示查詢結(jié)果中不能包含MUST_NOT所對應(yīng)得查詢子句的檢索結(jié)果。 3MUST_NOT和MUST_NOT

31、:無意義,檢索無結(jié)果。 4SHOULD與MUST、SHOULD與MUST_NOT:SHOULD與MUST連用時,無意義,結(jié)果為MUST子句的檢索結(jié)果。SHOULD與MUST_NOT連用時, SHOULD功能同MUST,相當(dāng)于MUST和MUST NOT的檢索結(jié)果。 5SHOULD與SHOULD:表示“或”關(guān)系,最終檢索結(jié)果為所有檢索子句的并集。RangeQuery范圍搜索 public RangeQuery(Term lowerTerm, Term upperTerm, boolean inclusive) 布爾型的參數(shù)表示是否將2個臨界值也加入到搜索中 查找所有書號在000001到000005

32、之間的圖書,并且不包括000001和000005 IndexSearcher searcher = new IndexSearcher(PATH); Term begin = new Term(booknumber,000001); Term end = new Term(booknumber,000005); RangeQuery query = new RangeQuery(begin,end,false); Hits hits = searcher.search(query);PrefixQuery 前綴搜索 鋼鐵是怎樣煉成的英雄兒女籬笆女人和狗女人是水做的我的兄弟和女兒白毛女鋼的世界鋼

33、鐵戰(zhàn)士 鋼鐵是怎樣煉成的鋼的世界鋼鐵戰(zhàn)士 IndexSearcher searcher = new IndexSearcher(PATH); Term prefix = new Term(bookname,鋼); PrefixQuery query = new PrefixQuery(prefix); Hits hits = searcher.search(query);PhraseQuery短語搜索鋼鐵是怎樣煉成的 , 鋼鐵戰(zhàn)士 , 鋼和鐵是兩種金屬元素 , 鋼要比鐵有更多的碳元素 , 鐵和鋼是兩種重要的金屬 , 鐵鋼是兩種重要的金屬鋼鐵戰(zhàn)士,鋼鐵是怎樣煉成的IndexSearcher se

34、archer = new IndexSearcher(PATH);PhraseQuery query = new PhraseQuery();query.add(new Term(bookname,鋼);query.add(new Term(bookname,鐵);Hits hits = searcher.search(query);可以看出,搜索的結(jié)果都是“鋼”和“鐵”兩字相連,而且順序也一致的文檔,即嚴(yán)格包含有“鋼鐵”這個短語的文檔PhraseQuery提供了一種為“坡度”的參數(shù),用于表示詞組的兩個字之間可以插入無關(guān)單字的個數(shù)。Public void setSlop(int s)Fuzzy

35、Query模糊搜索word,work,world,seed,sword,fordworkwork,wordFuzzyQuery(Term term) Calls FuzzyQuery(term, 0.5f, 0). FuzzyQuery(Term term, float minimumSimilarity) Calls FuzzyQuery(term, minimumSimilarity, 0). minimumSimilarity參數(shù)代表:最小相似度。默認(rèn)為0.5。數(shù)值越小,文檔數(shù)量越多。相似度為1時, FuzzyQuery變成了TermQuery。FuzzyQuery(Term term,

36、 float minimumSimilarity, int prefixLength) prefixLength參數(shù)代表:要有多少個前綴字母必須完全其配。WildcardQuery通配符搜索*代表0到多個字符,?代表一個單一的字符IndexSearcher searcher = new IndexSearcher(PATH);Term t = new Term(content,?o*);WildcardQuery query = new WildcardQuery(t);Hits hits = searcher.search(query);RegexQuery正則表達(dá)式搜索 涉及涉及2個包:個

37、包: Package org.apache.lucene.search.regex Package org.apache.regexp 注意:注意: /contrib/regex/lucene-regex-2.2.0.jar放入工程。放入工程。 jakarta-regexp-1.5.jar/site/downloads/downloads_regexp.cgiString regex = http:/a-z1, t = new Term(url,regex);RegexQuery query = new RegexQuery(t);MultiFi

38、eldQueryParser多域搜索org.apache.lucene.queryParser.MultiFieldQueryParser 在不同的Field上進行不同的查找public static Query parse(String queries, String fields, Analyzer analyzer) throws ParseException 在不同的Field上進行同一個查找,指定他們之間的布爾關(guān)系public static Query parse(String query, String fields, BooleanClause.Occur flags, Analyzer analyzer) throws ParseException 在不同的Field上進行不同的查找,指定他們之間的布爾關(guān)系public static Query parse(String queries, String fields, BooleanClause.Occur flags, Analyzer analyzer) throws ParseException 目錄Lucene 簡介簡介Lucene原理原理Lucene應(yīng)用實例應(yīng)用實例Lucen

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論