標籤:開發 優秀 讀者 日期範圍 creat ted 時間 document delete
http://www.cnblogs.com/forfuture1978/category/300665.html
Lucene 4.X 倒排索引原理與實現: (3) Term Dictionary和Index檔案 (FST詳細解析)摘要: 我們來看最複雜的部分,就是Term Dictionary和Term Index檔案,Term Dictionary檔案的尾碼名為tim,Term Index檔案的尾碼名是tip,格式。Term Dictionary檔案首先是一個Header,接下來是PostingsHeader,這兩個的格式...閱讀全文posted @ 2014-08-29 21:14 劉超覺先 閱讀(7180) | 評論 (2) 編輯Lucene 4.X 倒排索引原理與實現: (1) 詞典的設計摘要: 詞典的格式設計詞典中所儲存的資訊主要是三部分:Term字串Term的統計資訊,比如文檔頻率(Document Frequency)倒排表的位置資訊其中Term字串如何儲存是一個很大的問題,根據上一章基本原理的表述中,我們知道,寫入檔案的Term是按照字典順序排好序的,那麼如何將這些排好序的Ter...閱讀全文posted @ 2014-08-28 10:23 劉超覺先 閱讀(10542) | 評論 (4) 編輯lucene應用開發揭秘上線了摘要: Lucene應用開發揭秘華章培訓網地址:http://www.hztraining.com/bbs/showtopic-1954.aspxChinaPub地址:http://product.china-pub.com/3502099&ref=xiliegoumai注意事項:由於本人是首次錄製此類視頻,不完美之處敬請諒解此系列課程主要包涵三大部分,一是搜尋引擎的原理,二是lucene的深入解析及進階特性,三是即時搜尋分布式搜尋的架構解析及代碼實現對於搜尋引擎的原理部分,理論講解比較多,有的部分內容較少,處於完整性的需要,還是作為單獨的一節,可能視頻時間較短,好在視頻是分節銷售的,本人已經閱讀全文posted @ 2011-09-10 00:01 劉超覺先 閱讀(7022) | 評論 (6) 編輯LinkedIn公司實現的即時搜尋引擎Zoie摘要: 一、總體架構 Zoie是linkedin公司基於Lucene實現的即時搜尋引擎系統,按照其官方wiki的描述為: http://snaprojects.jira.com/wiki/display/ZOIE/Overview Zoie is a realtime indexing and search system, and as such needs to have relatively close coupling between the logically distinct Indexing and Searching subsystems: as soon as a document m閱讀全文posted @ 2010-11-29 21:19 劉超覺先 閱讀(10273) | 評論 (10) 編輯有關Lucene的問題(8):用Lucene構建即時索引的文檔更新問題摘要: 在有關Lucene的問題(7),討論了使用Lucene記憶體索引和硬碟索引構建即時索引的問題。 然而有的讀者提到,如果涉及到文檔的刪除及更新,那麼如何構建即時的索引呢?本節來討論這個問題。 1、Lucene刪除文檔的幾種方式 IndexReader.deleteDocument(int docID)是用 IndexReader 按文檔號刪除。 IndexReader.deleteDocuments(Term term)是用 IndexReader 刪除包含此詞(Term)的文檔。 IndexWriter.deleteDocuments(Term term)是用 IndexWriter 刪除包..閱讀全文posted @ 2010-06-27 14:17 劉超覺先 閱讀(11138) | 評論 (7) 編輯Lucene 原理與程式碼分析完整版摘要: Lucene 原理與程式碼分析系列文章已經基本告一段落,可能問題篇還會有新的更新。完整版pdf可由以下連結下載。Lucene 原理與程式碼分析完整版目錄如下:目錄目錄第一篇:原理篇第一章:全文檢索索引的基本原理一、總論二、索引裡面究竟存些什麼三、如何建立索引第一步:一些要索引的原文檔(Document)。第二步:將原文檔傳給分次組件(Tokenizer)。第三步:將得到的詞元(Token)傳給語言處理組件(Linguistic Processor)。第四步:將得到的詞(Term)傳給索引組件(Indexer)。1.利用得到的詞(Term)建立一個字典。2.對字典按字母順序進行排序。3.合并相同的詞(T閱讀全文posted @ 2010-06-13 01:52 劉超覺先 閱讀(40677) | 評論 (79) 編輯有關Lucene的問題(7):用Lucene構建即時的索引摘要: 由於前一章所述的Lucene的事務性,使得Lucene可以增量的添加一個段,我們知道,倒排索引是有一定的格式的,而這個格式一旦寫入是非常難以改變的,那麼如何能夠增量建索引呢?Lucene使用段這個概念解決了這個問題,對於每個已經產生的段,其倒排索引結構不會再改變,而增量添加的文檔添加到新的段中,段之間在一定的時刻進行合并,從而形成新的倒排索引結構。 然而也正因為Lucene的事務性,使得Lucene的索引不夠即時,如果想Lucene即時,則必須新添加的文檔後IndexWriter需要commit,在搜尋的時候IndexReader需要重新的開啟,然而當索引在硬碟上的時候,尤其是索引非常大的時候閱讀全文posted @ 2010-06-08 01:59 劉超覺先 閱讀(9874) | 評論 (8) 編輯有關Lucene的問題(6):Lucene的事務性摘要: 所謂事務性,本多指資料庫的屬性,包括ACID四個基本要素:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。 我們這裡主要討論隔離性,Lucene的IndexReader和IndexWriter具有隔離性。 當IndexReader.open開啟一個索引的時候,相對於給當前索引進行了一次snapshot,此後的任何修改都不會被看到。 僅當IndexReader.open開啟一個索引後,才有可能看到從上次開啟後對索引的修改。 當IndexWriter沒有調用Commit的時候,其修改的內容是不能夠被看到的,哪怕...閱讀全文posted @ 2010-06-07 01:39 劉超覺先 閱讀(4875) | 評論 (0) 編輯Lucene學習總結之十:Lucene的分詞器Analyzer摘要: 1、抽象類別Analyzer 其主要包含兩個介面,用於產生TokenStream: TokenStream tokenStream(String fieldName, Reader reader); TokenStream reusableTokenStream(String fieldName, Reader reader) ; 所謂TokenStream,後面我們會講到,是一個由分詞後的Token結果組成的流,能夠不斷的得到下一個分成的Token。 為了提高效能,使得在同一個線程中無需再產生新的TokenStream對象,老的可以被重用,所以有reusableTokenStream一說...閱讀全文posted @ 2010-06-06 22:14 劉超覺先 閱讀(25690) | 評論 (0) 編輯Lucene學習總結之九:Lucene的查詢對象摘要: Lucene學習總結之九:Lucene的查詢對象(1)http://www.cnblogs.com/forfuture1978/archive/2010/05/19/1738803.htmlLucene學習總結之九:Lucene的查詢對象(2)http://www.cnblogs.com/forfuture1978/archive/2010/05/19/1738804.htmlLucene學習總結之九:Lucene的查詢對象(3)http://www.cnblogs.com/forfuture1978/archive/2010/05/19/1738805.html---------------閱讀全文posted @ 2010-05-19 02:35 劉超覺先 閱讀(3540) | 評論 (1) 編輯Lucene學習總結之九:Lucene的查詢對象(1)摘要: Lucene除了支援查詢文法以外,還可以自己構造查詢對象進行搜尋。 從上一節的Lucene的文法一章可以知道,能與查詢語句對應的查詢對象有:BooleanQuery,FuzzyQuery,MatchAllDocsQuery,MultiTermQuery,MultiPhraseQuery,PhraseQuery,PrefixQuery,TermRangeQuery,TermQuery,WildcardQuery。 Lucene還支援一些查詢對象並沒有查詢語句與之對應,但是能夠實現相對進階的功能,本節主要討論這些進階的查詢對象。 它們中間最主要的一些階層如下,我們將一一解析。 Query B.閱讀全文posted @ 2010-05-19 02:29 劉超覺先 閱讀(7515) | 評論 (3) 編輯Lucene學習總結之九:Lucene的查詢對象(2)摘要: 5、SpanQuery 所謂SpanQuery也即在查詢過程中需要考慮進Term的位置資訊的查詢對象。 SpanQuery中最基本的是SpanTermQuery,其只包含一個Term,與TermQuery所不同的是,其提供一個函數來得到位置資訊: public Spans getSpans(final IndexReader reader) throws IOException { return new TermSpans(reader.termPositions(term), term); } Spans有以下方法: next() 得到下一篇文檔號,不同的SpanQuery此方...閱讀全文posted @ 2010-05-19 02:29 劉超覺先 閱讀(2160) | 評論 (0) 編輯Lucene學習總結之九:Lucene的查詢對象(3)摘要: 6、FilteredQuery FilteredQuery包含兩個成員變數: Query query:查詢對象 Filter filter:其有一個函數DocIdSet getDocIdSet(IndexReader reader) 得到一個文檔號集合,結果文檔必須出自此文檔集合,注此處的過濾器所包含的文檔號並不是要過濾掉的文檔號,而是過濾後需要的文檔號。 FilterQuery所得到的結果集同兩者取AND查詢相同,只不過打分的時候,FilterQuery只考慮query的部分,不考慮filter的部分。 Filter包含很多種如下: 6.1、TermsFilter 其包含一個成員變數...閱讀全文posted @ 2010-05-19 02:29 劉超覺先 閱讀(4781) | 評論 (0) 編輯有關Lucene的問題(5):Lucene中的TooManyClause異常摘要: 為什麼會產生這個異常: 使用Lucene檢索過程中如果用到RangeQuery,PrefixQuery,WildcardQuery,FuzzyQuery這四種Query,可能會產生TooManyClauses異常。為什麼會產生這個異常呢?舉例說明: 以RangeQuery為例,如果日期範圍為19990101到20091231,在索引檔案中有19990102,19990103等等這些日期片語,那麼RangeQuery會被擴充成“19990102 OR 19990103”,成了2個子句。可以想象,如果索引檔案裡面在這個時間段內的日期有很多,那麼就會產生很多子句。 PrefixQuery等也是同樣的閱讀全文posted @ 2010-05-16 00:29 劉超覺先 閱讀(1189) | 評論 (2) 編輯Lucene學習總結之八:Lucene的查詢文法,JavaCC及QueryParser(2)摘要: 三、解析QueryParser.jj3.1、聲明QueryParser類在QueryParser.jj檔案中,PARSER_BEGIN(QueryParser)和PARSER_END(QueryParser)之間,定義了QueryParser類。其中最重要的一個函數是public Query parse(String query)函數,也即我們解析Lucene查詢文法的時候調用的函數。這是一個純Java代碼定義的函數,會直接拷貝到QueryParser.java檔案中。parse函數中,最重要的一行代碼是調用Query res = TopLevelQuery(field),而TopLevelQ閱讀全文posted @ 2010-05-08 00:21 劉超覺先 閱讀(5179) | 評論 (0) 編輯Lucene學習總結之八:Lucene的查詢文法,JavaCC及QueryParser(1)摘要: 一、Lucene的查詢文法Lucene所支援的查詢文法可見http://lucene.apache.org/java/3_0_1/queryparsersyntax.html(1) 文法關鍵字+ - && || ! ( ) { } [ ] ^ " ~ * ? : \如果所要查詢的查詢詞中本身包含關鍵字,則需要用\進行轉義(2) 查詢詞(Term)Lucene支援兩種查詢詞,一種是單一查詢詞,如"hello",一種是片語(phrase),如"hello world"。(3) 查詢域(Field)在查詢語句中,可以指定從哪個域中尋找閱讀全文posted @ 2010-05-08 00:20 劉超覺先 閱讀(9283) | 評論 (0) 編輯資訊檢索導論(譯):第一章 布爾檢索(1)摘要: 資訊檢索這個詞的含義非常廣。僅從錢包中取出信用卡,然後輸入信用卡號也屬於資訊檢索的範疇。然而,從學術角度來講,資訊檢索定義如下: 資訊檢索即從大量非結構化文檔集中找到滿足需要的文檔的過程。 按照如上定義,資訊檢索曾經是僅少數人書管理員,律師,專業搜尋者參與的活動。而今非昔比,當今成千上萬的人每天都會用搜尋引擎搜尋網頁和郵件。資訊檢索正迅速取代傳統的資料庫搜尋的方式,成為資訊擷取的主要方式。除此之外,資訊檢索技術還可以解決其他有關資料和資訊的問題。所謂非結構化資料,指的是沒有清晰的可被電腦理解的語義結構的資料。與之相對的是結構化資料,例如傳統的關係型資料庫,被很多公司用來儲存產品庫存及員工閱讀全文posted @ 2010-05-01 20:57 劉超覺先 閱讀(2550) | 評論 (0) 編輯Lucene學習總結之七:Lucene搜尋過程解析摘要: 本系列文章將詳細描述幾乎最新版本的Lucene的基本原理和程式碼分析。其中總體架構和索引檔案格式是Lucene 2.9的,索引過程分析是Lucene 3.0的。鑒於索引檔案格式沒有太大變化,因而原文沒有更新,原理和架構的文章中引用了前輩的一些圖,可能屬於早期的Lucene,但不影響對原理和架構的理解。本系列文章尚在撰寫之中,將會有Java CC, 分詞器,QueryParser,查詢語句與查詢對象等章節。Lucene學習總結之七:Lucene搜尋過程解析(1) http://www.cnblogs.com/forfuture1978/archive/2010/04/04/1704242.html閱讀全文posted @ 2010-04-04 18:42 劉超覺先 閱讀(5271) | 評論 (4) 編輯Lucene學習總結之七:Lucene搜尋過程解析(6)摘要: 2.4、搜尋查詢對象 2.4.4、收集文檔結果集合及計算打分 在函數IndexSearcher.search(Weight, Filter, int) 中,有如下代碼: TopScoreDocCollector collector = TopScoreDocCollector.create(nDocs, !weight.scoresDocsOutOfOrder()); search(weight, filter, collector); return collector.topDocs(); 2.4.4.1、建立結果文檔收集器 TopScoreDocCollector collector...閱讀全文posted @ 2010-04-04 18:12 劉超覺先 閱讀(3613) | 評論 (0) 編輯Lucene學習總結之七:Lucene搜尋過程解析(5)摘要: 2.4、搜尋查詢對象 2.4.3、進行倒排表合并 在得到了Scorer對象樹以及SumScorer對象樹後,便是倒排表的合并以及打分計算的過程。 合并倒排表在此節中進行分析,而Scorer對象樹來進行打分的計算則在下一節分析。 BooleanScorer2.score(Collector) 代碼如下: public void score(Collector collector) throws IOException { collector.setScorer(this); while ((doc = countingSumScorer.nextDoc()) != NO_MORE...閱讀全文posted @ 2010-04-04 18:05 劉超覺先 閱讀(5246) | 評論 (1) 編輯Lucene學習總結之七:Lucene搜尋過程解析(4)摘要: 2.4、搜尋查詢對象 2.4.1.2、建立Weight對象樹 BooleanQuery.createWeight(Searcher) 最終返回return new BooleanWeight(searcher),BooleanWeight建構函式的具體實現如下: public BooleanWeight(Searcher searcher) { this.similarity = getSimilarity(searcher); weights = new ArrayList<Weight>(clauses.size()); //也是一個遞迴的過程,沿著新的Query對象樹一...閱讀全文posted @ 2010-04-04 17:53 劉超覺先 閱讀(3547) | 評論 (3) 編輯Lucene學習總結之七:Lucene搜尋過程解析(3)摘要: 2.3、QueryParser解析查詢語句產生查詢對象代碼為:QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "contents", new StandardAnalyzer(Version.LUCENE_CURRENT)); Query query = parser.parse("+(+apple* -boy) (cat* dog) -(eat~ foods)");此過程相對複雜,涉及JavaCC,QueryParser,分詞器,查詢文法等,本章不會詳細論述,會在後面的章節中一一閱讀全文posted @ 2010-04-04 17:40 劉超覺先 閱讀(4670) | 評論 (3) 編輯Lucene學習總結之七:Lucene搜尋過程解析(2)摘要: 二、Lucene搜尋詳細過程 為瞭解析Lucene對索引檔案搜尋的過程,預先寫入索引了如下幾個檔案: file01.txt: apple apples cat dog file02.txt: apple boy cat category file03.txt: apply dog eat etc file04.txt: apply cat foods 2.1、開啟IndexReader指向索引檔案夾 代碼為: IndexReader reader = IndexReader.open(FSDirectory.open(indexDir)); 其實是調用了DirectoryReader.open閱讀全文posted @ 2010-04-04 17:31 劉超覺先 閱讀(5258) | 評論 (0) 編輯Lucene學習總結之七:Lucene搜尋過程解析(1)摘要: 一、Lucene搜尋過程總論 搜尋的過程總的來說就是將詞典及倒排表資訊從索引中讀出來,根據使用者輸入的查詢語句合并倒排表,得到結果文檔集並對文檔進行打分的過程。 其可用如示: 總共包括以下幾個過程: IndexReader開啟索引檔案,讀取並開啟指向索引檔案的流。 使用者輸入查詢語句 將查詢語句轉換為查詢對象Query對象樹 構造Weight對象樹,用於計算詞的權重Term Weight,也即計算打分公式中與僅與搜尋語句相關與文檔無關的部分(紅色部分)。 構造Scorer對象樹,用於計算打分(TermScorer.score())。 在構造Scorer對象樹的過程中,其葉子節點...閱讀全文posted @ 2010-04-04 17:27 劉超覺先 閱讀(5896) | 評論 (1) 編輯Lucene學習總結之六:Lucene打分公式的數學推導摘要: 在進行Lucene的搜尋過程解析之前,有必要單獨的一張把Lucene score公式的推導,各部分的意義闡述一下。因為Lucene的搜尋過程,很重要的一個步驟就是逐步的計算各部分的分數。 Lucene的打分公式非常複雜,如下: 在推導之前,先逐個介紹每部分的意義: t:Term,這裡的Term是指包含域資訊的Term,也即title:hello和content:hello是不同的Term coord(q,d):一次搜尋可能包含多個搜尋字詞,而一篇文檔中也可能包含多個搜尋字詞,此項表示,當一篇文檔中包含的搜尋字詞越多,則此文檔則打分越高。 queryNorm(q):計算每個查詢條目的方差和,...閱讀全文posted @ 2010-03-07 00:18 劉超覺先 閱讀(9135) | 評論 (9) 編輯Lucene學習總結之五:Lucene段合并(merge)過程分析摘要: 一、段合并過程總論 IndexWriter中與段合并有關的成員變數有: HashSet<SegmentInfo> mergingSegments = new HashSet<SegmentInfo>(); //儲存正在合并的段,以防止合并期間再次選中被合并。 MergePolicy mergePolicy = new LogByteSizeMergePolicy(this);//合并策略,也即選取哪些段來進行合并。 MergeScheduler mergeScheduler = new ConcurrentMergeScheduler();//段合并器,背後有一個線程負閱讀全文posted @ 2010-03-06 00:49 劉超覺先 閱讀(7807) | 評論 (1) 編輯Lucene 3.0 原理與程式碼分析摘要: 本系列文章將詳細描述幾乎最新版本的Lucene的基本原理和程式碼分析。其中總體架構和索引檔案格式是Lucene 2.9的,索引過程分析是Lucene 3.0的。鑒於索引檔案格式沒有太大變化,因而原文沒有更新,原理和架構的文章中引用了前輩的一些圖,可能屬於早期的Lucene,但不影響對原理和架構的理解。本系列文章尚在撰寫之中,將會有分詞器,段合并,QueryParser,查詢語句與查詢對象,搜尋過程,打分公式的推導等章節。提前給大家分享,希望大家批評指正。Lucene學習總結之一:全文檢索索引的基本原理http://www.cnblogs.com/forfuture1978/archive/2009/閱讀全文posted @ 2010-02-22 20:25 劉超覺先 閱讀(7205) | 評論 (8) 編輯有關Lucene的問題(4):影響Lucene對文檔打分的四種方式摘要: 在索引階段設定Document Boost和Field Boost,儲存在(.nrm)檔案中。 如果希望某些文檔和某些域比其他的域更重要,如果此文檔和此域包含所要查詢的詞則應該得分較高,則可以在索引階段設定文檔的boost和域的boost值。 這些值是在索引階段就寫入索引檔案的,儲存在標準化因子(.nrm)檔案中,一旦設定,除非刪除此文檔,否則無法改變。 如果不進行設定,則Document Boost和Field Boost預設為1。 Document Boost及FieldBoost的設定方式如下: Document doc = new Document(); Field f = n...閱讀全文posted @ 2010-02-08 23:44 劉超覺先 閱讀(3559) | 評論 (2) 編輯有關Lucene的問題(3): 向量空間模型與Lucene的打分機制摘要: 問題: 在你的文章中提到了: 於是我們把所有此文檔中詞(term)的權重(term weight) 看作一個向量。 Document = {term1, term2, …… ,term N} Document Vector = {weight1, weight2, …… ,weight N} 同樣我們把查詢語句看作一個簡單的文檔,也用向量來表示。 Query = {term1, term 2, …… , term N} Query Vector = {weight1, weight2, …… , weight N} 於是我們把所有此文檔中詞(term)的權重(term weight...閱讀全文posted @ 2010-02-06 13:05 劉超覺先 閱讀(3597) | 評論 (0) 編輯有關Lucene的問題(2):stemming和lemmatization摘要: 問題: 我實驗了一下文章中提到的 stemming 和 lemmatization 將單詞縮減為詞根形式,如“cars”到“car”等。這種操作稱為:stemming。 將單詞轉變為詞根形式,如“drove”到“drive”等。這種操作稱為:lemmatization。 實驗沒有成功 代碼如下: public class TestNorms { public void createIndex() throws IOException { Directory d = new SimpleFSDirectory(new File("d:/falconTest/lucene3/...閱讀全文posted @ 2010-02-06 13:04 劉超覺先 閱讀(3701) | 評論 (1) 編輯有關Lucene的問題(1):為什麼能搜的到“中華 AND 共和國”卻搜不到“中華共和國”?摘要: 問題: 使用中科院的中文分詞對“中華人民共和國” 進行索引,它被分詞為"中華", "人民", "共和國",用“人民共和國”進行搜尋,可以搜到,而搜尋"中華共和國"卻搜尋不到,用“中華 AND 共和國”卻可以搜出來,為什嗎? 回答: 我下載了http://ictclas.org/Download.html中科院的詞做了簡單的分析,如果索引的時候“中華人民共和國”被分成了“中華”“人民”“共和國”,而搜尋的時候,搜“中華共和國”,則被分為了“中華 共和國”,然而構建Query Parser構建Query Object的閱讀全文posted @ 2010-02-06 13:04 劉超覺先 閱讀(2155) | 評論 (1) 編輯Lucene學習總結之四:Lucene索引過程分析(4)摘要: 6、關閉IndexWriter對象 代碼: writer.close(); --> IndexWriter.closeInternal(boolean) --> (1) 將索引資訊由記憶體寫入磁碟: flush(waitForMerges, true, true); --> (2) 進行段合并: mergeScheduler.merge(this); 對段的合并將在後面的章節進行討論,此處僅僅討論將索引資訊由寫入磁碟的過程。 代碼: IndexWriter.flush(boolean triggerMerge, boolean flushDocStores, boole...閱讀全文posted @ 2010-02-02 02:02 劉超覺先 閱讀(4372) | 評論 (5) 編輯Lucene學習總結之四:Lucene索引過程分析(3)摘要: 5、DocumentsWriter對CharBlockPool,ByteBlockPool,IntBlockPool的緩衝管理 在索引的過程中,DocumentsWriter將詞資訊(term)儲存在CharBlockPool中,將文檔號(doc ID),詞頻(freq)和位置(prox)資訊儲存在ByteBlockPool中。 在ByteBlockPool中,緩衝是分塊(slice)分配的,塊(slice)是分層次的,層次越高,此層的塊越大,每一層的塊大小事相同的。 nextLevelArray表示的是當前層的下一層是第幾層,可見第9層的下一層還是第9層,也就是說最高有9層。 le...閱讀全文posted @ 2010-02-02 02:01 劉超覺先 閱讀(3903) | 評論 (0) 編輯Lucene學習總結之四:Lucene索引過程分析(2)摘要: 3、將文檔加入IndexWriter 代碼: writer.addDocument(doc); -->IndexWriter.addDocument(Document doc, Analyzer analyzer) -->doFlush = docWriter.addDocument(doc, analyzer); --> DocumentsWriter.updateDocument(Document, Analyzer, Term) 註:--> 代表一級函數調用 IndexWriter繼而調用DocumentsWriter.addDocument,其又調用Docume閱讀全文posted @ 2010-02-02 01:59 劉超覺先 閱讀(7996) | 評論 (1) 編輯Lucene學習總結之四:Lucene索引過程分析(1)摘要: 對於Lucene的索引過程,除了將詞(Term)寫入倒排表並最終寫入Lucene的索引檔案外,還包括分詞(Analyzer)和合并段(merge segments)的過程,本次不包括這兩部分,將在以後的文章中進行分析。 Lucene的索引過程,很多的部落格,文章都有介紹,推薦大家上網搜一篇文章:《Annotated Lucene》,好像中文名稱叫《Lucene源碼剖析》是很不錯的。 想要真正瞭解Lucene索引檔案過程,最好的辦法是跟進代碼調試,對著文章看代碼,這樣不但能夠最詳細準確的掌握索引過程(描述都是有偏差的,而代碼是不會騙你的),而且還能夠學習Lucene的一些優秀的實現,能夠在以後的工閱讀全文posted @ 2010-02-02 01:58 劉超覺先 閱讀(14480) | 評論 (3) 編輯Lucene學習總結之三:Lucene的索引檔案格式(3)摘要: 四、具體格式 4.2. 反向資訊 反向資訊是索引檔案的核心,也即反向索引。 反向索引包括兩部分,左面是詞典(Term Dictionary),右面是倒排表(Posting List)。 在Lucene中,這兩部分是分檔案儲存體的,詞典是儲存在tii,tis中的,倒排表又包括兩部分,一部分是文檔號及詞頻,儲存在frq中,一部分是詞的位置資訊,儲存在prx中。 Term Dictionary (tii, tis) –> Frequencies (.frq) –> Positions (.prx) 4.2.1. 詞典(tis)及詞典索引(tii)資訊 在詞典中,所有的詞是按照字典順序...閱讀全文posted @ 2010-02-02 01:43 劉超覺先 閱讀(10785) | 評論 (2) 編輯Lucene學習總結之三:Lucene的索引檔案格式(2)摘要: 四、具體格式 上面曾經交代過,Lucene儲存了從Index到Segment到Document到Field一直到Term的正向資訊,也包括了從Term到Document映射的反向資訊,還有其他一些Lucene特有的資訊。下面對這三種資訊一一介紹。 4.1. 正向資訊 Index –> Segments (segments.gen, segments_N) –> Field(fnm, fdx, fdt) –> Term (tvx, tvd, tvf) 上面的階層不是十分的準確,因為segments.gen和segments_N儲存的是段(segment)的中繼資料資訊(met閱讀全文posted @ 2009-12-14 12:35 劉超覺先 閱讀(16825) | 評論 (3) 編輯Lucene學習總結之三:Lucene的索引檔案格式(1)摘要: Lucene的索引裡面存了些什麼,如何存放的,也即Lucene的索引檔案格式,是讀懂Lucene原始碼的一把鑰匙。 當我們真正進入到Lucene原始碼之中的時候,我們會發現: Lucene的索引過程,就是按照全文檢索索引的基本過程,將倒排表寫成此檔案格式的過程。 Lucene的搜尋過程,就是按照此檔案格式將索引進去的資訊讀出來,然後計算每篇文檔打分(score)的過程。 本文詳細解讀了Apache Lucene - Index File Formats(http://lucene.apache.org/java/2_9_0/fileformats.html) 這篇文章。 一、基本概念 ...閱讀全文posted @ 2009-12-14 12:34 劉超覺先 閱讀(31365) | 評論 (10) 編輯Lucene學習總結之二:Lucene的總體架構摘要: Lucene總的來說是: 一個高效的,可擴充的,全文檢索索引庫。 全部用Java實現,無須配置。 僅支援純文字檔案的索引(Indexing)和搜尋(Search)。 不負責由其他格式的檔案抽取純文字檔案,或從網路中抓取檔案的過程。 在Lucene in action中,Lucene 的構架和過程如, 說明Lucene是有索引和搜尋的兩個過程,包含索引建立,索引,搜尋三個要點。 讓我們更細一些看Lucene的各組件: 被索引的文檔用Document對象表示。 IndexWriter通過函數addDocument將文檔添加到索引中,實現建立索引的過程。 Lucene的...閱讀全文posted @ 2009-12-14 12:32 劉超覺先 閱讀(18978) | 評論 (4) 編輯Lucene學習總結之一:全文檢索索引的基本原理摘要: 全文檢索索引大體分兩個過程,索引建立(Indexing)和搜尋索引(Search)。 * 索引建立:將現實世界中所有的結構化和非結構化資料提取資訊,建立索引的過程。 * 搜尋索引:就是得到使用者的查詢請求,搜尋建立的索引,然後返回結果的過程。 於是全文檢索索引就存在三個重要問題: 1. 索引裡面究竟存些什嗎?(Index) 2. 如何建立索引?(Indexing) 3. 如何對索引進行搜尋?(Search)閱讀全文
Lucene 4.X 全套教程