青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

為生存而奔跑

   :: 首頁 :: 聯系 :: 聚合  :: 管理
  271 Posts :: 0 Stories :: 58 Comments :: 0 Trackbacks

留言簿(5)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 331734
  • 排名 - 74

最新評論

閱讀排行榜

評論排行榜

轉:http://www.ibm.com/developerworks/cn/java/j-lo-lucene1/
本文首先介紹了Lucene的一些基本概念,然后開發了一個應用程序演示了利用Lucene建立索引并在該索引上進行搜索的過程。

Lucene 簡介

Lucene 是一個基于 Java 的全文信息檢索工具包,它不是一個完整的搜索應用程序,而是為你的應用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一個開源項目。也是目前最為流行的基于 Java 開源全文檢索工具包。

目前已經有很多應用程序的搜索功能是基于 Lucene 的,比如 Eclipse 的幫助系統的搜索功能。Lucene 能夠為文本類型的數據建立索引,所以你只要能把你要索引的數據格式轉化的文本的,Lucene 就能對你的文檔進行索引和搜索。比如你要對一些 HTML 文檔,PDF 文檔進行索引的話你就首先需要把 HTML 文檔和 PDF 文檔轉化成文本格式的,然后將轉化后的內容交給 Lucene 進行索引,然后把創建好的索引文件保存到磁盤或者內存中,最后根據用戶輸入的查詢條件在索引文件上進行查詢。不指定要索引的文檔的格式也使 Lucene 能夠幾乎適用于所有的搜索應用程序。

圖 1 表示了搜索應用程序和 Lucene 之間的關系,也反映了利用 Lucene 構建搜索應用程序的流程:


圖1. 搜索應用程序和 Lucene 之間的關系
圖1. 搜索應用程序和 Lucene 之間的關系 




回頁首


索引和搜索

索引是現代搜索引擎的核心,建立索引的過程就是把源數據處理成非常方便查詢的索引文件的過程。為什么索引這么重要呢,試想你現在要在大量的文檔中搜索含有某個關鍵詞的文檔,那么如果不建立索引的話你就需要把這些文檔順序的讀入內存,然后檢查這個文章中是不是含有要查找的關鍵詞,這樣的話就會耗費非常多的時間,想想搜索引擎可是在毫秒級的時間內查找出要搜索的結果的。這就是由于建立了索引的原因,你可以把索引想象成這樣一種數據結構,他能夠使你快速的隨機訪問存儲在索引中的關鍵詞,進而找到該關鍵詞所關聯的文檔。Lucene 采用的是一種稱為反向索引(inverted index)的機制。反向索引就是說我們維護了一個詞/短語表,對于這個表中的每個詞/短語,都有一個鏈表描述了有哪些文檔包含了這個詞/短語。這樣在用戶輸入查詢條件的時候,就能非常快的得到搜索結果。我們將在本系列文章的第二部分詳細介紹 Lucene 的索引機制,由于 Lucene 提供了簡單易用的 API,所以即使讀者剛開始對全文本進行索引的機制并不太了解,也可以非常容易的使用 Lucene 對你的文檔實現索引。

對文檔建立好索引后,就可以在這些索引上面進行搜索了。搜索引擎首先會對搜索的關鍵詞進行解析,然后再在建立好的索引上面進行查找,最終返回和用戶輸入的關鍵詞相關聯的文檔。





回頁首


Lucene 軟件包分析

Lucene 軟件包的發布形式是一個 JAR 文件,下面我們分析一下這個 JAR 文件里面的主要的 JAVA 包,使讀者對之有個初步的了解。

Package: org.apache.lucene.document

這個包提供了一些為封裝要索引的文檔所需要的類,比如 Document, Field。這樣,每一個文檔最終被封裝成了一個 Document 對象。

Package: org.apache.lucene.analysis

這個包主要功能是對文檔進行分詞,因為文檔在建立索引之前必須要進行分詞,所以這個包的作用可以看成是為建立索引做準備工作。

Package: org.apache.lucene.index

這個包提供了一些類來協助創建索引以及對創建好的索引進行更新。這里面有兩個基礎的類:IndexWriter 和 IndexReader,其中 IndexWriter 是用來創建索引并添加文檔到索引中的,IndexReader 是用來刪除索引中的文檔的。

Package: org.apache.lucene.search

這個包提供了對在建立好的索引上進行搜索所需要的類。比如 IndexSearcher 和 Hits, IndexSearcher 定義了在指定的索引上進行搜索的方法,Hits 用來保存搜索得到的結果。





回頁首


一個簡單的搜索應用程序

假設我們的電腦的目錄中含有很多文本文檔,我們需要查找哪些文檔含有某個關鍵詞。為了實現這種功能,我們首先利用 Lucene 對這個目錄中的文檔建立索引,然后在建立好的索引中搜索我們所要查找的文檔。通過這個例子讀者會對如何利用 Lucene 構建自己的搜索應用程序有個比較清楚的認識。





回頁首


建立索引

為了對文檔進行索引,Lucene 提供了五個基礎的類,他們分別是 Document, Field, IndexWriter, Analyzer, Directory。下面我們分別介紹一下這五個類的用途:

Document

Document 是用來描述文檔的,這里的文檔可以指一個 HTML 頁面,一封電子郵件,或者是一個文本文件。一個 Document 對象由多個 Field 對象組成的。可以把一個 Document 對象想象成數據庫中的一個記錄,而每個 Field 對象就是記錄的一個字段。

Field

Field 對象是用來描述一個文檔的某個屬性的,比如一封電子郵件的標題和內容可以用兩個 Field 對象分別描述。

Analyzer

在一個文檔被索引之前,首先需要對文檔內容進行分詞處理,這部分工作就是由 Analyzer 來做的。Analyzer 類是一個抽象類,它有多個實現。針對不同的語言和應用需要選擇適合的 Analyzer。Analyzer 把分詞后的內容交給 IndexWriter 來建立索引。

IndexWriter

IndexWriter 是 Lucene 用來創建索引的一個核心的類,他的作用是把一個個的 Document 對象加到索引中來。

Directory

這個類代表了 Lucene 的索引的存儲的位置,這是一個抽象類,它目前有兩個實現,第一個是 FSDirectory,它表示一個存儲在文件系統中的索引的位置。第二個是 RAMDirectory,它表示一個存儲在內存當中的索引的位置。

熟悉了建立索引所需要的這些類后,我們就開始對某個目錄下面的文本文件建立索引了,清單1給出了對某個目錄下的文本文件建立索引的源代碼。


清單 1. 對文本文件建立索引
package TestLucene;
            import java.io.File;
            import java.io.FileReader;
            import java.io.Reader;
            import java.util.Date;
            import org.apache.lucene.analysis.Analyzer;
            import org.apache.lucene.analysis.standard.StandardAnalyzer;
            import org.apache.lucene.document.Document;
            import org.apache.lucene.document.Field;
            import org.apache.lucene.index.IndexWriter;
            /**
            * This class demonstrate the process of creating index with Lucene
            * for text files
            */
            public class TxtFileIndexer {
            public static void main(String[] args) throws Exception{
            //indexDir is the directory that hosts Lucene's index files
            File   indexDir = new File("D:\\luceneIndex");
            //dataDir is the directory that hosts the text files that to be indexed
            File   dataDir  = new File("D:\\luceneData");
            Analyzer luceneAnalyzer = new StandardAnalyzer();
            File[] dataFiles  = dataDir.listFiles();
            IndexWriter indexWriter = new IndexWriter(indexDir,luceneAnalyzer,true);
            long startTime = new Date().getTime();
            for(int i = 0; i < dataFiles.length; i++){
            if(dataFiles[i].isFile() && dataFiles[i].getName().endsWith(".txt")){
            System.out.println("Indexing file " + dataFiles[i].getCanonicalPath());
            Document document = new Document();
            Reader txtReader = new FileReader(dataFiles[i]);
            document.add(Field.Text("path",dataFiles[i].getCanonicalPath()));
            document.add(Field.Text("contents",txtReader));
            indexWriter.addDocument(document);
            }
            }
            indexWriter.optimize();
            indexWriter.close();
            long endTime = new Date().getTime();
            System.out.println("It takes " + (endTime - startTime)
            + " milliseconds to create index for the files in directory "
            + dataDir.getPath());
            }
            }
            

在清單1中,我們注意到類 IndexWriter 的構造函數需要三個參數,第一個參數指定了所創建的索引要存放的位置,他可以是一個 File 對象,也可以是一個 FSDirectory 對象或者 RAMDirectory 對象。第二個參數指定了 Analyzer 類的一個實現,也就是指定這個索引是用哪個分詞器對文擋內容進行分詞。第三個參數是一個布爾型的變量,如果為 true 的話就代表創建一個新的索引,為 false 的話就代表在原來索引的基礎上進行操作。接著程序遍歷了目錄下面的所有文本文檔,并為每一個文本文檔創建了一個 Document 對象。然后把文本文檔的兩個屬性:路徑和內容加入到了兩個 Field 對象中,接著在把這兩個 Field 對象加入到 Document 對象中,最后把這個文檔用 IndexWriter 類的 add 方法加入到索引中去。這樣我們便完成了索引的創建。接下來我們進入在建立好的索引上進行搜索的部分。





回頁首


搜索文檔

利用Lucene進行搜索就像建立索引一樣也是非常方便的。在上面一部分中,我們已經為一個目錄下的文本文檔建立好了索引,現在我們就要在這個索引上進行搜索以找到包含某個關鍵詞或短語的文檔。Lucene提供了幾個基礎的類來完成這個過程,它們分別是呢IndexSearcher, Term, Query, TermQuery, Hits. 下面我們分別介紹這幾個類的功能。

Query

這是一個抽象類,他有多個實現,比如TermQuery, BooleanQuery, PrefixQuery. 這個類的目的是把用戶輸入的查詢字符串封裝成Lucene能夠識別的Query。

Term

Term是搜索的基本單位,一個Term對象有兩個String類型的域組成。生成一個Term對象可以有如下一條語句來完成:Term term = new Term(“fieldName”,”queryWord”); 其中第一個參數代表了要在文檔的哪一個Field上進行查找,第二個參數代表了要查詢的關鍵詞。

TermQuery

TermQuery是抽象類Query的一個子類,它同時也是Lucene支持的最為基本的一個查詢類。生成一個TermQuery對象由如下語句完成: TermQuery termQuery = new TermQuery(new Term(“fieldName”,”queryWord”)); 它的構造函數只接受一個參數,那就是一個Term對象。

IndexSearcher

IndexSearcher是用來在建立好的索引上進行搜索的。它只能以只讀的方式打開一個索引,所以可以有多個IndexSearcher的實例在一個索引上進行操作。

Hits

Hits是用來保存搜索的結果的。

介紹完這些搜索所必須的類之后,我們就開始在之前所建立的索引上進行搜索了,清單2給出了完成搜索功能所需要的代碼。


清單2 :在建立好的索引上進行搜索
package TestLucene;
            import java.io.File;
            import org.apache.lucene.document.Document;
            import org.apache.lucene.index.Term;
            import org.apache.lucene.search.Hits;
            import org.apache.lucene.search.IndexSearcher;
            import org.apache.lucene.search.TermQuery;
            import org.apache.lucene.store.FSDirectory;
            /**
            * This class is used to demonstrate the
            * process of searching on an existing
            * Lucene index
            *
            */
            public class TxtFileSearcher {
            public static void main(String[] args) throws Exception{
            String queryStr = "lucene";
            //This is the directory that hosts the Lucene index
            File indexDir = new File("D:\\luceneIndex");
            FSDirectory directory = FSDirectory.getDirectory(indexDir,false);
            IndexSearcher searcher = new IndexSearcher(directory);
            if(!indexDir.exists()){
            System.out.println("The Lucene index is not exist");
            return;
            }
            Term term = new Term("contents",queryStr.toLowerCase());
            TermQuery luceneQuery = new TermQuery(term);
            Hits hits = searcher.search(luceneQuery);
            for(int i = 0; i < hits.length(); i++){
            Document document = hits.doc(i);
            System.out.println("File: " + document.get("path"));
            }
            }
            }
            

在清單2中,類IndexSearcher的構造函數接受一個類型為Directory的對象,Directory是一個抽象類,它目前有兩個子類:FSDirctory和RAMDirectory. 我們的程序中傳入了一個FSDirctory對象作為其參數,代表了一個存儲在磁盤上的索引的位置。構造函數執行完成后,代表了這個IndexSearcher以只讀的方式打開了一個索引。然后我們程序構造了一個Term對象,通過這個Term對象,我們指定了要在文檔的內容中搜索包含關鍵詞”lucene”的文檔。接著利用這個Term對象構造出TermQuery對象并把這個TermQuery對象傳入到IndexSearcher的search方法中進行查詢,返回的結果保存在Hits對象中。最后我們用了一個循環語句把搜索到的文檔的路徑都打印了出來。 好了,我們的搜索應用程序已經開發完畢,怎么樣,利用Lucene開發搜索應用程序是不是很簡單。





回頁首


總結

本文首先介紹了 Lucene 的一些基本概念,然后開發了一個應用程序演示了利用 Lucene 建立索引并在該索引上進行搜索的過程。希望本文能夠為學習 Lucene 的讀者提供幫助。



關于作者

周登朋,軟件工程師,上海交通大學研究生,對 Java 技術以及信息檢索技術很感興趣。您可以通過 zhoudengpeng@yahoo.com.cn 與他聯系。

posted on 2010-01-05 09:41 baby-fly 閱讀(345) 評論(0)  編輯 收藏 引用 所屬分類: Information Retrival / Data Mining
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美成人精品在线观看| 久久中文欧美| 免费在线亚洲欧美| 久久久精彩视频| 久久色在线观看| 嫩模写真一区二区三区三州| 麻豆久久婷婷| 欧美国产日韩精品免费观看| 欧美成人官网二区| 日韩视频欧美视频| 亚洲欧美春色| 国产亚洲毛片在线| 亚洲欧美日韩在线| 久久成人18免费网站| 午夜在线播放视频欧美| 先锋影音久久久| 亚洲精品乱码久久久久久蜜桃91| 亚洲视频一二三| 日韩亚洲欧美中文三级| 亚洲欧洲综合另类| 亚洲免费电影在线| 夜夜嗨av一区二区三区免费区| 亚洲人成亚洲人成在线观看图片 | 亚洲韩国青草视频| 欧美在线观看一区二区三区| 欧美一区二区三区免费在线看| 亚洲男人的天堂在线aⅴ视频| 亚洲一区二区三区在线观看视频| 亚洲欧美偷拍卡通变态| 久久久久久自在自线| 欧美大片一区二区| 99视频一区二区| 欧美在线啊v| 欧美精品成人91久久久久久久| 国产精品久久久久久久久久久久久 | 久久国产精品99国产| 久久久噜噜噜久久| 欧美丰满高潮xxxx喷水动漫| 亚洲精品色婷婷福利天堂| 午夜国产一区| 欧美护士18xxxxhd| 国产精品自在欧美一区| 亚洲精品国偷自产在线99热| 亚洲欧美日韩视频一区| 欧美国产大片| 亚洲资源在线观看| 久久综合一区| 一片黄亚洲嫩模| 久久久久久亚洲综合影院红桃| 欧美在线日韩| 欧美性大战久久久久| 国产精品久久久久久影院8一贰佰| 国产精品v日韩精品v欧美精品网站| 欧美视频一区二区| 国产精品美女久久福利网站| 国产午夜精品麻豆| 国内欧美视频一区二区| 亚洲一卡久久| 亚洲国产成人久久| 欧美日韩成人一区二区| 欧美在线综合| 亚洲靠逼com| 欧美亚洲一区二区在线观看| 亚洲高清视频在线| 久久久精品国产一区二区三区 | 亚洲激情影院| 久久网站免费| 欧美在线关看| 国产精品免费网站| 亚洲欧美日韩在线高清直播| 亚洲精品永久免费| 欧美国产日本在线| 亚洲国产高清高潮精品美女| 欧美在线视频一区| 亚洲午夜激情网页| 国产精品视频一| 亚洲欧美精品suv| 99国产精品自拍| 国产精品v日韩精品| 亚洲一区三区在线观看| 欧美激情国产日韩精品一区18| 亚洲精品乱码久久久久久蜜桃91| 久久久久国产精品人| 国产亚洲a∨片在线观看| 欧美亚洲一区二区三区| 亚洲婷婷综合久久一本伊一区| 欧美日韩亚洲一区二区三区在线观看| 日韩视频不卡中文| 亚洲精品久久久久久下一站 | 亚洲精品影院在线观看| 亚洲靠逼com| 欧美日韩一区二区三区在线观看免| 亚洲午夜女主播在线直播| 日韩亚洲欧美一区| 国产精品免费网站| 久久亚洲精品一区| 免费观看成人www动漫视频| 亚洲日本久久| 一区二区高清在线观看| 国产精品亚洲综合久久| 久久亚洲色图| 欧美a级片网站| 中文欧美日韩| 午夜精品一区二区三区四区| 黄页网站一区| 亚洲国产精品视频| 国产精品高潮呻吟久久av黑人| 性欧美在线看片a免费观看| 欧美在线首页| 日韩视频―中文字幕| 亚洲一卡久久| 亚洲福利久久| 国产精品豆花视频| 午夜日韩激情| 日韩视频一区二区三区在线播放 | 亚洲国产另类久久久精品极度| 亚洲激情一区二区三区| 国产精品免费一区二区三区在线观看 | 亚洲精品一二区| 国产日韩欧美一区二区三区在线观看 | 一区二区成人精品 | 欧美怡红院视频一区二区三区| 悠悠资源网久久精品| 99国产精品久久| 亚洲电影免费观看高清完整版在线观看 | 久久婷婷综合激情| 欧美精品高清视频| 久久久久久久激情视频| 欧美日韩黄色一区二区| 久久精品首页| 欧美日韩国产小视频| 久久免费国产| 国产精品视频久久久| 亚洲区中文字幕| 国内成+人亚洲+欧美+综合在线| 一本久道综合久久精品| 亚洲欧洲在线一区| 久久狠狠亚洲综合| 欧美亚洲免费电影| 欧美久久久久| 欧美福利视频| 美女视频网站黄色亚洲| 久久激情五月激情| 国产精品久久久久久久7电影| 在线亚洲免费| 欧美大学生性色视频| 欧美xxx成人| 在线成人国产| 久久久久九九九九| 久久亚洲不卡| 狠狠久久婷婷| 欧美一区二区三区啪啪| 欧美一级久久| 国产精品二区在线| 国产精品99久久久久久久vr | 一本色道久久综合狠狠躁篇怎么玩| 欧美亚洲网站| 欧美亚洲午夜视频在线观看| 国产精品毛片| 午夜精品久久久久久久白皮肤 | 亚洲小视频在线| 欧美日韩一区二区在线| 99re66热这里只有精品3直播| 亚洲美女中出| 欧美日韩亚洲一区二区三区在线| 91久久久久久| 在线一区二区视频| 欧美日韩精品久久久| 亚洲久色影视| 亚洲欧美在线免费| 国产精自产拍久久久久久| 亚洲欧美日韩专区| 美日韩精品免费| 亚洲国产精品一区二区第一页| 久久夜色精品国产亚洲aⅴ| 亚洲国产精品久久91精品| 亚洲精品视频在线| 国产精品啊啊啊| 性色av一区二区三区在线观看 | 欧美日韩亚洲免费| 亚洲国产免费看| 亚洲少妇诱惑| 国产婷婷一区二区| 女人色偷偷aa久久天堂| 亚洲国产精品国自产拍av秋霞| 亚洲午夜视频在线观看| 国产伦精品一区二区三区视频黑人| 在线亚洲精品| 欧美亚洲专区| 91久久中文字幕| 欧美亚洲综合久久| 亚洲国产三级网| 国产精品日本| 美女诱惑一区| 久久国产精品99精品国产| 国产精品丝袜白浆摸在线| 新狼窝色av性久久久久久| 午夜日韩激情| 亚洲欧洲久久| 国产亚洲a∨片在线观看|