Lucence,lucene教程

來源:互聯網
上載者:User

Lucence,lucene教程

Lucene是apache軟體基金會4 jakarta項目組的一個子項目,是一個開放原始碼的全文檢索索引引擎工具包,但它不是一個完整的全文檢索索引引擎,而是一個全文檢索索引引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。Lucene的目的是為軟體開發人員提供一個簡單易用的工具包.

粘貼這句話的意思就是想說明  Lucene僅僅是一個工具包,搜尋引擎的工具包.

有人會問?Lucene和solr的區別,solr是一個搜尋系統,打個比方,就如servlet和struts2的區別   Lucene就是servlet,solr就好比solr,solr封裝了Lucene.

下面說說Lucene的原理:

我們使用Lucene,其實使用的是他的倒排查詢

什麼是倒排查詢?舉個例子

新華字典,我們都用過吧,新華字典分為兩部分,第一部門就是目錄的邊旁部首,第二部分就是本文,一個一個字的解釋,

我們在用新華字典的時候,一般我們都是通過邊旁部首找字,沒有人一頁一頁的翻字典找字吧.

Lucene的倒排就是如此,他會檢索文本,資料庫,web網頁,在把內容分詞,就像邊旁部首

再次強調

搜尋引擎(百度,Google)和lucene的區別搜尋引擎就是一個應用,lucene就是一個搜尋工具類

 

name:lucene表示要搜尋name這個Field域中,內容為“lucene”的文檔。desc:lucene AND desc:java 表示要搜尋即包括關鍵字“lucene”也包括“java”的文檔。 看不懂沒關係我接下來說明Doucment和Field關係這裡我用資料庫中的一條資料說明

這一條資料就是一個document文檔

 每一個欄位就是一個Field域這樣說是不是豁然開朗了.  接下來,我們說說分詞器這個lucene是外國人搞得,對中文的支援不說你也知道,不多外國人也想到這一點,"我是中國人">>我  是  中  國  人   >> 這樣的效果其實還不是我們想要的,我們要的是"中國","國人"這樣的詞彙,這裡我也不打啞謎了,市場上有很多中文分詞器,無敵的存在我覺得就是IK了,這是一個jar包,匯入項目即可,說他無敵是因為他可以自己加詞,比如"屌絲","高富帥",這也詞,可以自己加到分詞器中,讓程式認得.

這就是要用到的包;

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 }

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.