Lucene是一個全文檢索的框架,apache組織提供了一個用Java實現的全文搜索引擎的開源項目。這里我們對apache的lucene的框架做一個簡單的介紹。心甘情願這四個字,透着一股卑微,但也有藏不住的勇敢。
lucene的第一個實例
一、maven中引入的依賴pom.xml
<properties> <lucene.version>6.6.0</lucene.version> <common-io.version>2.5</common-io.version> </properties> <dependencies> <!-- lucene core的依賴--> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>${lucene.version}</version> </dependency> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-queryparser</artifactId> <version>${lucene.version}</version> </dependency> <!-- commomsIO的依賴--> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>${common-io.version}</version> </dependency> </dependencies>
二、關於lucene的java代碼如下
package com.linux.huhx.lucene_1; import org.apache.commons.io.FileUtils; 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.document.StringField; import org.apache.lucene.document.TextField; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.RAMDirectory; import java.io.File; import java.io.IOException; public class BaseLucene_1 { public static void main(String[] args) throws Exception { // 存放在內存中 Directory dir = new RAMDirectory(); new BaseLucene_1().createIndex(dir); new BaseLucene_1().search(dir); } /** * 創建索引 */ public void createIndex(Directory dir) throws IOException { IndexWriter indexWriter = null; // 1. 創建 Directory (索引存放位置),這里是參數dir // 2. 創建IndexWriter 寫索引 Analyzer analyzer = new StandardAnalyzer(); IndexWriterConfig iwc = new IndexWriterConfig(analyzer); indexWriter = new IndexWriter(dir, iwc); // 3. 創建Document 對象 field Document document; File file = new File("file/example"); for (File f : file.listFiles()) { document = new Document(); // 4. 為Documen添加field document.add(new Field("content", FileUtils.readFileToString(f, "utf-8"), TextField.TYPE_STORED)); document.add(new TextField("fileName", f.getName(), Field.Store.YES)); document.add(new StringField("filePath", f.getAbsolutePath(), Field.Store.YES)); // 5. 通過IndexWriter 添加文檔到索引中 indexWriter.addDocument(document); } indexWriter.close(); } /** * 根據內容搜索 * @param dir * @throws Exception */ public void search(Directory dir) throws Exception { IndexReader indexReader = null; // 1. 創建 Directory,這里通過參數傳遞過來的dir // Directory dir = FSDirectory.open(new File("file/index").toPath()); // 本地磁盤 // 2. 創建 IndexReader indexReader = DirectoryReader.open(dir); // 3. 創建 IndexSearch IndexSearcher indexSearcher = new IndexSearcher(indexReader); // 4. 創建搜索的Query // 創建parse確定搜索的內容,第二個參數為搜索的file QueryParser queryParser = new QueryParser("content", new StandardAnalyzer()); // 創建Query,表示搜索域中的內容 Query query = queryParser.parse("love"); // 5. 搜索並返回 TopDocs TopDocs topDocs = indexSearcher.search(query, 10); // 6. 根據topDocs 獲得 scoreDocs ScoreDoc[] socreDocs = topDocs.scoreDocs; for (ScoreDoc doc : socreDocs) { // 獲取Document對象 Document document = indexSearcher.doc(doc.doc); // 根據Document對象獲取需要的值 System.out.println(document.get("fileName")); System.out.println(document.get("content")); } indexReader.close(); } }
三、運行的結果如下
java1.txt
I love you, java.
java2.txt
I love you, linux.
java3.txt
I love you, huhx.
lucene的一些說明介紹
一、Lucene建立索引過程的幾個核心類
1、IndexWriter: 索引過程的核心組件,這個類負責創建新索引或者打開已有索引,以及向索引中添加、刪除或更新索引的信息。 2、Directory: 描述了Lucene索引的存放位置。它是一個抽象類,它的子類負責具體指定索引的存儲路徑。 3、Analyzer: 文本文件在被索引之前,需要經過Analyzer處理。Analyzer是由InderWriter的構造方法來指定的,它負責從被索引文本文件中提取語匯單元,交提出剩下的無用信息。 4、Document:代表一些域(Field)的集合,比如元數據(作者、標題、主題和修改日期)都可以作為文檔的不同域單獨存儲並被索引。Lucene的內核只處理java.lang.String、java.io.Reader對象和本地數字類型。 5、Field:索引中的每個文檔都包含一個或多個不同命名的域,這些域包含在Field類中。每個域都有一個域名和對應的域值,以及一組選項來精確控制Lucene索引操作各個域值。
二、Lucene搜索過程中的幾個核心類
1、InderSearcher: 用於搜索由IndexWriter類創建的索引,這個類公開了幾個搜索方法,它是連接索引的中心環節。 2、Term: 是搜索功能的基本單元,與Field對象類似,Term對象包含一對字符串元素:域名和單詞。它還與索引操作有着。 3、Query: 是查詢類的父類。子類例如:BooleanQuery、SpanQuery、PhraseQuery等等。 4、TermQuery: Lucene提供的最基本的查詢類型,它用來匹配指定域中包含特定項的文檔。 5、TopDocs: 一個簡單的指針容器,指針一般指向前N個排名的搜索結果,搜索結果即匹配查詢條件的文檔。
友情鏈接
