Lucene是apache軟件基金會4 jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。Lucene的目的是爲軟件開發人員提供一個簡單易用的工具包.java
粘貼這句話的意思就是想說明 Lucene僅僅是一個工具包,搜索引擎的工具包.web
有人會問?Lucene和solr的區別,solr是一個搜索系統,打個比方,就如servlet和struts2的區別 Lucene就是servlet,solr就比如solr,solr封裝了Lucene.數據庫
下面說說Lucene的原理:apache
咱們使用Lucene,其實使用的是他的倒排查詢架構
什麼是倒排查詢?舉個例子工具
新華字典,咱們都用過吧,新華字典分爲兩部分,第一部門就是目錄的邊旁部首,第二部分就是正文,一個一個字的解釋,搜索引擎
咱們在用新華字典的時候,通常咱們都是經過邊旁部首找字,沒有人一頁一頁的翻字典找字吧.spa
Lucene的倒排就是如此,他會檢索文本,數據庫,web網頁,在把內容分詞,就像邊旁部首開放源代碼
再次強調code
這一條數據就是一個document文檔
每個字段就是一個Field域這就是要用到的包;
ik下載後把這3個文件也要導入項目中,ext.dic是加詞的,stop是停詞的.
前面的都是Lucece的理論,只有理論搞懂了,下面的代碼實現過程也就輕鬆了
1 package com.itheima.lucene; 2 3 import java.io.File; 4 import java.util.ArrayList; 5 import java.util.List; 6 7 import org.apache.lucene.analysis.Analyzer; 8 import org.apache.lucene.analysis.standard.StandardAnalyzer; 9 import org.apache.lucene.document.Document; 10 import org.apache.lucene.document.Field.Store; 11 import org.apache.lucene.document.TextField; 12 import org.apache.lucene.index.DirectoryReader; 13 import org.apache.lucene.index.IndexReader; 14 import org.apache.lucene.index.IndexWriter; 15 import org.apache.lucene.index.IndexWriterConfig; 16 import org.apache.lucene.queryparser.classic.QueryParser; 17 import org.apache.lucene.search.IndexSearcher; 18 import org.apache.lucene.search.Query; 19 import org.apache.lucene.search.ScoreDoc; 20 import org.apache.lucene.search.TopDocs; 21 import org.apache.lucene.store.Directory; 22 import org.apache.lucene.store.FSDirectory; 23 import org.apache.lucene.util.Version; 24 import org.junit.Test; 25 import org.wltea.analyzer.lucene.IKAnalyzer; 26 27 import com.itheima.dao.BookDao; 28 import com.itheima.dao.impl.BookDaoImpl; 29 import com.itheima.pojo.Book; 30 31 public class CreateIndexTest { 32 //分詞 33 @Test 34 public void testCreateIndex() throws Exception{ 35 // 1. 採集數據 36 BookDao bookDao = new BookDaoImpl(); 37 List<Book> listBook = bookDao.queryBookList(); 38 39 // 2. 建立Document文檔對象 40 List<Document> documents = new ArrayList<>(); 41 for (Book bk : listBook) { 42 43 Document doc = new Document(); 44 doc.add(new TextField("id", String.valueOf(bk.getId()), Store.YES));// Store.YES:表示存儲到文檔域中 45 doc.add(new TextField("name", bk.getName(), Store.YES)); 46 doc.add(new TextField("price", String.valueOf(bk.getPrice()), Store.YES)); 47 doc.add(new TextField("pic", bk.getPic(), Store.YES)); 48 doc.add(new TextField("desc", bk.getDesc(), Store.YES)); 49 50 // 把Document放到list中 51 documents.add(doc); 52 } 53 54 // 3. 建立分析器(分詞器) 55 //Analyzer analyzer = new StandardAnalyzer(); 56 //中文 IK 57 Analyzer analyzer = new IKAnalyzer(); 58 59 // 4. 建立IndexWriterConfig配置信息類 60 IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer); 61 62 // 5. 建立Directory對象,聲明索引庫存儲位置 63 Directory directory = FSDirectory.open(new File("H:\\temp")); 64 65 // 6. 建立IndexWriter寫入對象 66 IndexWriter writer = new IndexWriter(directory, config); 67 68 // 7. 把Document寫入到索引庫中 69 for (Document doc : documents) { 70 writer.addDocument(doc); 71 } 72 73 // 8. 釋放資源 74 writer.close(); 75 } 76
//查 77 @Test 78 public void serachIndex() throws Exception{ 79 //建立分詞器 必須和檢索時的分析器一致 80 Analyzer analyzer = new StandardAnalyzer(); 81 // 建立搜索解析器,第一個參數:默認Field域,第二個參數:分詞器 82 QueryParser queryParser = new QueryParser("desc", analyzer); 83 84 // 1. 建立Query搜索對象 85 Query query = queryParser.parse("desc:java AND lucene"); 86 87 // 2. 建立Directory流對象,聲明索引庫位置 88 Directory directory = FSDirectory.open(new File("H:\\temp")); 89 90 // 3. 建立索引讀取對象IndexReader 91 IndexReader indexReader = DirectoryReader.open(directory); 92 93 // 4. 建立索引搜索對象IndexSearcher 94 IndexSearcher indexSearcher = new IndexSearcher(indexReader); 95 96 // 5. 使用索引搜索對象,執行搜索,返回結果集TopDocs 97 // 第一個參數:搜索對象,第二個參數:返回的數據條數,指定查詢結果最頂部的n條數據返回 98 TopDocs topDocs = indexSearcher.search(query, 10); 99 System.out.println("查詢到的數據總條數是:" + topDocs.totalHits); 100 //得到結果集 101 ScoreDoc[] docs = topDocs.scoreDocs; 102 103 // 6. 解析結果集 104 for (ScoreDoc scoreDoc : docs) { 105 //得到文檔 106 int docID = scoreDoc.doc; 107 Document doc = indexSearcher.doc(docID); 108 109 System.out.println("docID:"+docID); 110 System.out.println("bookid:"+doc.get("id")); 111 System.out.println("pic:"+doc.get("pic")); 112 System.out.println("name:"+doc.get("name")); 113 System.out.println("desc:"+doc.get("desc")); 114 System.out.println("price:"+doc.get("price")); 115 } 116 117 // 7. 釋放資源 118 indexReader.close(); 119 } 120 }