lucene全文檢索實現流程

2021-05-22 23:32:16 字數 2819 閱讀 2252

對於lucene全文檢索,可以簡約地看看它的7個主要類,這7個類同時也表達了處理全文檢索的7個意念。因為資料庫比較為人所熟悉,它又與全文檢索某些理念極為相似,所以在對下面的概念說明時,將會大量在滲入資料庫和全文檢索間的模擬。

1)document :它的中文意思是文件,對於乙個文件,通常都包括它的標題、時間、作者、內容。如果讓它的意思泛化,它也有檔案的意思(相信lucene的作者在取這個類名的時候也是經過再三斟酌的),對於檔案,它可以指乙個txt文字、乙個html網頁、乙個pdf檔案等等。總而言之,它是對映著某乙個具體的檔案,這就是它的單位粒度。對應於資料庫

的概念是記錄,英文是record,weblucene在索引源的xml中就原原本本地採用了這個概念,可參照/dump/blog.xml 。

2)field :中文意思是字段。漢語的翻譯將這個單詞的意思表達得更恰如其分了,意思是文字片段,它可以是乙個或多個字。欄位是文件(document)的次粒度單位,也是檢索的最基本單位。注意這個概念跟在搜尋引擎的輸入框中隨意輸入的那幾個字或幾組字不是一樣的,在搜尋輸入框中輸入的那些文字首先需要經過乙個queryparser(這也是7個類中的乙個)將其分解成真正的field。 在資料庫

中本來就有field 這個概念,它即是record的次級單位。在資料庫

一條或多條記錄怎麼被找出來的,往往就經由對field的檢索而得來。在全文檢索中document的最終取得也是差不多,它是根據現在的某個filed來決定的。即根據文件中的某些還不完整的東西牽引出它的所需的全部。

示例**:

**內容

[com.chedong.weblucene.search.webluceneresultsettest]

document doc = new document();

doc.add(field.keyword("keyword", "房地產"));

doc.add(field.keyword("keyword", "非典"));

3)indexwriter :索引書寫者

示例**:

[org.apache.lucene.index.testindexwriter]

**內容

document doc = new document();

doc.add(field.unstored("content", "aaa"));

try

catch (ioexception e)

它的構造器new indexwriter(dir, new whitespaceanalyzer(), true) 有三個引數,分別是directory物件、分析器物件(這是下乙個要介紹的類)和乙個布林量,是否要重寫索引就是由這個布林量標明的,如果取false則僅僅是將索引附加上來。

4)analyzer : 分析器,它將目錄中的一組原始檔案分析成由一組document和它相應的次級粒度field組成的索引。因為不同的檔案型別,同樣的文字其內部檔案流組織形式是不一樣的,所以需要不同的分析器處理不同的檔案型別(如pdfanalyzer、htmlanalyzer)。又因為不同的文字語言處理field拆分(token)上是不一樣的,所以在語言角度上又有另一層分析器的類別區分,如下面這行**是處理普通中文字元的

[com.chedong.weblucene.search.webluceneresultsettest]

indexwriter writer = new indexwriter(dir, new cjkanalyzer(), true);

5)queryparser :這前面在區分field和使用者輸入的搜尋關鍵字時已經提及了。(它所用的詞是query,跟資料庫

所用的是乙個概念的,這個詞同樣的檢索上讓人感覺沒有像search那麼費盡心思去深究。)queryparser並沒有實際地去做查詢工作,它只是parser(剖析)使用者輸入的東西,並把剖析的結果以一種規則的形式送給searcher去執行乙個真正的搜尋。作為剖析的結果,不僅僅是field,還有field們相互間的關係(terms,譬如邏輯和and,邏輯或or, 邏輯非not)。

6)searcher : 搜尋乙個query,將結果返回。

[org.apache.lucene.search..testnot]

**內容

ramdirectory store = new ramdirectory();

indexwriter writer = new indexwriter(store, new ******analyzer(), true);

document d1 = new document();

d1.add(field.text("field", "a b"));

writer.adddocument(d1);

writer.optimize();

writer.close();

searcher searcher = new indexsearcher(store);

query query = queryparser.parse("a not b", "field", new ******analyzer());

//system.out.println(query);

hits hits = searcher.search(query);

對於每乙個搜尋器物件,它都需要指定乙個索引檔案路徑,然後由搜尋器對query物件執行查詢。 上面的這個類袖珍地對7個主要類都均有涉及。

7)hits : lucene的類注釋是:a ranked list of documents, used to hold search results. 搜尋的結果不僅僅是一些文件,而且這些文件還是有級別的,這個級別是對於先後次序而言的。它對應於資料庫

中的recordset / resultset 。

lucene 全文檢索

在講全文檢索之前,先說下資訊檢索。資訊檢索通俗的講,就是從資訊集合中找出與使用者相關的資訊,除了文字之外,還有音訊 影象等。全文檢索 把使用者的查詢請求和全文中的每個詞進行比較,不考慮查詢請求與文字語義上的匹配。b 全文檢索是指計算機索引程式通過掃瞄文章中的每乙個詞,對每乙個詞建立乙個索引,指明該詞...

Lucene全文檢索

流程圖 一.建立文件 文件域 注 每乙個doucment可以有多個field,不同的document可以有不同的field,同乙個document可以有相同的field 網域名稱和域值都相同 每乙個文件都有唯一的編號 二.分析文件 將文件中的大寫轉化成小寫,清除 is a 標點 停用詞等過程生成語彙...

Lucene全文檢索初探

1 全文檢索是什麼 先建立索引,再對索引進行搜尋的過程。2 為什麼需要全文檢索 在網頁搜尋時,如果沒有全文檢索,每一次檢索資料都會對資料庫進行查詢,當資料庫的資料量非常大時,搜尋起來非常耗時以及耗費資源,所以我們可以先將資料庫的資料採集出來,提前對這些資料進行整理,建立索引,將這些索引檔案儲存到伺服...