Lucence

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

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

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

下面說說Lucene的原理:

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

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

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

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

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

再次強調

搜索引擎(百度,谷歌)和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 }

 

 來源:itnose

 

 

上一篇: 筆記:MyBatis XML配置詳解

下一篇: 項目管理利器-Maven(Windows安裝)

分享到: 更多
麻将游戏旧版本 体育彩票七位数 快乐十分任选四稳赚技巧 pk10专家在线预测 重庆时时彩龙虎和稳盈 北京pk10玩法规则 2019重庆时时采彩开奖时间 pk10冠军大小稳赢压发 北京赛pk10计划软件 大小单双稳赚倍投法 七码倍投是怎么计算 彩票助赢软件是不是个骗局 佩里西奇 二八杠麻将玩法 重庆老时时彩彩开奖 秒速时时在线预测