Lucene 02 - Lucene的入门程序(Java API的简单使用)
目錄
- 1 準(zhǔn)備環(huán)境
- 2 準(zhǔn)備數(shù)據(jù)
- 3 創(chuàng)建工程
- 3.1 創(chuàng)建Maven Project(打包方式選jar即可)
- 3.2 配置pom.xml, 導(dǎo)入依賴
- 4 編寫基礎(chǔ)代碼
- 4.1 編寫圖書POJO
- 4.2 編寫圖書DAO接口
- 4.3 實(shí)現(xiàn)圖書DAO接口
- 5 索引流程的實(shí)現(xiàn)
- 5.1 示例代碼
- 5.2 測試結(jié)果
- 6 使用Luke工具查看索引
- 6.1 使用說明
- 6.2 運(yùn)行界面一
- 6.3 運(yùn)行界面二
- 6.4 運(yùn)行界面三
- 7 檢索流程的實(shí)現(xiàn)
- 7.1 使用Luke工具搜索
- 7.2 示例代碼
- 7.3 測試結(jié)果
- 7.4 結(jié)果說明
- 7.5 IndexSearcher方法
1 準(zhǔn)備環(huán)境
JDK: 1.8.0_162
IDE: Eclipse Neon.3
數(shù)據(jù)庫: MySQL 5.7.20
Lucene: 4.10.4(已經(jīng)很穩(wěn)定了,高版本對(duì)部分分詞器支持不好)
2 準(zhǔn)備數(shù)據(jù)
SET FOREIGN_KEY_CHECKS=0;-------------------------------- Table structure for `book` -------------------------------- DROP TABLE IF EXISTS `book`; CREATE TABLE `book` (? `id` int(11) DEFAULT NULL,? `bookname` varchar(500) DEFAULT NULL,? `price` float DEFAULT NULL,? `pic` varchar(200) DEFAULT NULL,? `bookdesc` varchar(2000) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;-------------------------------- Records of book -------------------------------- INSERT INTO `book` VALUES ('1', 'java從入門到精通', '56', '1.jpg', '《Java從入門到精通》是人民郵電出版社于 2010年出版的圖書, 由國家863中部軟件孵化器主編. 以零基礎(chǔ)講解為宗旨, 深入淺出地講解Java的各項(xiàng)技術(shù)及實(shí)戰(zhàn)技能. 本書從初學(xué)者角度出發(fā), 通過通俗易懂的語言、豐富多彩的實(shí)例, 詳細(xì)介紹了使用Java語言進(jìn)行程序開發(fā)應(yīng)該掌握的各方面技術(shù).'); INSERT INTO `book` VALUES ('2', 'java web開發(fā)', '80', '2.jpg', 'Java Web, 是用Java技術(shù)來解決相關(guān)web互聯(lián)網(wǎng)領(lǐng)域的技術(shù)總和. web包括: web服務(wù)器和web客戶端兩部分. Java在客戶端的應(yīng)用有java applet, 不過使用得很少, Java在服務(wù)器端的應(yīng)用非常的豐富, 比如Servlet, JSP和第三方框架等等. Java技術(shù)對(duì)Web領(lǐng)域的發(fā)展注入了強(qiáng)大的動(dòng)力. '); INSERT INTO `book` VALUES ('3', 'lucene從入門到精通', '100', '3.jpg', '本書總結(jié)搜索引擎相關(guān)理論與實(shí)際解決方案, 并給出了 Java 實(shí)現(xiàn), 其中利用了流行的開源項(xiàng)目Lucene和Solr, 而且還包括原創(chuàng)的實(shí)現(xiàn). 本書主要包括總體介紹部分、爬蟲部分、自然語言處理部分、全文檢索部分以及相關(guān)案例分析. 爬蟲部分介紹了網(wǎng)頁遍歷方法和如何實(shí)現(xiàn)增量抓取, 并介紹了從網(wǎng)頁等各種格式的文檔中提取主要內(nèi)容的方法.'); INSERT INTO `book` VALUES ('4', 'lucene in action', '90', '4.jpg', '本書深入淺出地介紹了lucene——一個(gè)開源的使用java語言編寫的全文搜索引擎開發(fā)包. 它通過淺顯的語言、大量的圖注、豐富的代碼示例, 以及清晰的結(jié)構(gòu)為讀者呈現(xiàn)出作為優(yōu)秀開源項(xiàng)目的lucene所體現(xiàn)的強(qiáng)大功能. '); INSERT INTO `book` VALUES ('5', 'Lucene Java精華版', '80', '5.jpg', '本書總結(jié)搜索引擎相關(guān)理論與實(shí)際解決方案, 并給出了 Java 實(shí)現(xiàn), 其中利用了流行的開源項(xiàng)目Lucene和Solr, 而且還包括原創(chuàng)的實(shí)現(xiàn). 本書主要包括總體介紹部分、爬蟲部分、自然語言處理部分、全文檢索部分以及相關(guān)案例分析. 爬蟲部分介紹了網(wǎng)頁遍歷方法和如何實(shí)現(xiàn)增量抓取, 并介紹了從網(wǎng)頁等各種格式的文檔中提取主要內(nèi)容的方法. ');3 創(chuàng)建工程
3.1 創(chuàng)建Maven Project(打包方式選jar即可)
3.2 配置pom.xml, 導(dǎo)入依賴
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.healchow</groupId><artifactId>lucene-first</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>lucene-first</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!-- mysql版本 --><mysql.version>5.1.44</mysql.version><!-- lucene版本 --><lucene.version>4.10.4</lucene.version></properties><dependencies><!-- mysql數(shù)據(jù)庫依賴 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!-- lucene依賴包 --><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-core</artifactId><version>${lucene.version}</version></dependency><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-analyzers-common</artifactId><version>${lucene.version}</version></dependency><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-queryparser</artifactId><version>${lucene.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies> </project>4 編寫基礎(chǔ)代碼
4.1 編寫圖書POJO
public class Book {private Integer id; // int(11) DEFAULT NULL,private String bookname; // varchar(500) DEFAULT NULL,private Float price; // float DEFAULT NULL,private String pic; // varchar(200) DEFAULT NULL,private String bookdesc; // varchar(2000) DEFAULT NULL// Getters/Setters@Overridepublic String toString() {return "Book [id=" + id + ", bookname=" + bookname + ", price=" + price + ", pic=" + pic + ", bookdesc=" + bookdesc + "]";} }4.2 編寫圖書DAO接口
public interface BookDao {/*** 查詢?nèi)繄D書 */List<Book> queryBookList(); }4.3 實(shí)現(xiàn)圖書DAO接口
public class BookDaoImpl implements BookDao {/*** 查詢?nèi)繄D書*/public List<Book> listAll() {// 創(chuàng)建圖書結(jié)果集合ListList<Book> books = new ArrayList<Book>();Connection conn = null;PreparedStatement preStatement = null;ResultSet resultSet = null;try {// 加載驅(qū)動(dòng)Class.forName("com.mysql.jdbc.Driver");// 創(chuàng)建數(shù)據(jù)庫連接對(duì)象conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/lucene?useSSL=true", "root", "password");// 定義查詢SQLString sql = "select * from book";// 創(chuàng)建Statement語句對(duì)象preStatement = conn.prepareStatement(sql);// 執(zhí)行語句, 得到結(jié)果集resultSet = preStatement.executeQuery();// 處理結(jié)果集while (resultSet.next()) {// 創(chuàng)建圖書對(duì)象Book book = new Book();book.setId(resultSet.getInt("id"));book.setBookname(resultSet.getString("bookname"));book.setPrice(resultSet.getFloat("price"));book.setPic(resultSet.getString("pic"));book.setBookdesc(resultSet.getString("bookdesc"));// 將查詢到的結(jié)果添加到list中books.add(book);}} catch (Exception e) {e.printStackTrace();} finally {// 釋放資源try {if (null != conn) conn.close();if (null != preStatement) preStatement.close();if (null != resultSet) resultSet.close();} catch (Exception e) {e.printStackTrace();}}return books;}/*** 測試功能的主方法*/public static void main(String[] args) {// 創(chuàng)建圖書Dao的實(shí)現(xiàn)對(duì)象BookDao bookDao = new BookDaoImpl();List<Book> books = bookDao.listAll();// 如果結(jié)果不為空, 則便利輸出for (Book book : books) {System.out.println(book);}} }測試結(jié)果如下:
5 索引流程的實(shí)現(xiàn)
(1) 采集原始數(shù)據(jù);
(2) 創(chuàng)建文檔對(duì)象(Document);
(3) 創(chuàng)建分析器對(duì)象(Analyzer), 用于分詞;
(4) 創(chuàng)建索引配置對(duì)象(IndexWriterConfig), 用于配置Lucene;
(5) 創(chuàng)建索引庫目錄位置對(duì)象(Directory), 指定索引庫的存儲(chǔ)位置;
(6) 創(chuàng)建索引寫入對(duì)象(IndexWriter), 將文檔對(duì)象寫入索引庫;
(7) 使用IndexWriter對(duì)象, 創(chuàng)建索引;
(8) 釋放資源.
5.1 示例代碼
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.Store; import org.apache.lucene.document.TextField; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version;public class IndexManager {/*** 創(chuàng)建索引功能的測試* @throws Exception*/@Testpublic void createIndex() throws IOException{// 1. 采集數(shù)據(jù)BookDao bookDao = new BookDaoImpl();List<Book> books = bookDao.listAll();// 2. 創(chuàng)建文檔對(duì)象List<Document> documents = new ArrayList<Document>();for (Book book : books) {Document document = new Document();// 給文檔對(duì)象添加域// add方法: 把域添加到文檔對(duì)象中, field參數(shù): 要添加的域// TextField: 文本域, 屬性name:域的名稱, value:域的值, store:指定是否將域值保存到文檔中document.add(new TextField("bookId", book.getId() + "", Store.YES));document.add(new TextField("bookName", book.getBookname(), Store.YES));document.add(new TextField("bookPrice", book.getPrice() + "", Store.YES));document.add(new TextField("bookPic", book.getPic(), Store.YES));document.add(new TextField("bookDesc", book.getBookdesc(), Store.YES));// 將文檔對(duì)象添加到文檔對(duì)象集合中documents.add(document);}// 3. 創(chuàng)建分析器對(duì)象(Analyzer), 用于分詞Analyzer analyzer = new StandardAnalyzer();// 4. 創(chuàng)建索引配置對(duì)象(IndexWriterConfig), 用于配置Lucene// 參數(shù)一:當(dāng)前使用的Lucene版本, 參數(shù)二:分析器IndexWriterConfig indexConfig = new IndexWriterConfig(Version.LUCENE_4_10_2, analyzer);// 5. 創(chuàng)建索引庫目錄位置對(duì)象(Directory), 指定索引庫的存儲(chǔ)位置File path = new File("/your_path/index");Directory directory = FSDirectory.open(path);// 6. 創(chuàng)建索引寫入對(duì)象(IndexWriter), 將文檔對(duì)象寫入索引IndexWriter indexWriter = new IndexWriter(directory, indexConfig);// 7. 使用IndexWriter對(duì)象創(chuàng)建索引for (Document doc : documents) {// addDocement(doc): 將文檔對(duì)象寫入索引庫indexWriter.addDocument(doc);}// 8. 釋放資源indexWriter.close();} }5.2 測試結(jié)果
說明: 只要看到以下文件, 說明索引已經(jīng)創(chuàng)建成功了:
6 使用Luke工具查看索引
6.1 使用說明
Windows OS下,雙擊運(yùn)行start.bat文件(前提是需要配置jdk的環(huán)境變量);
Mac OS下, 在終端中進(jìn)入當(dāng)前目錄, 然后鍵入 ./start.sh 即可運(yùn)行.
6.2 運(yùn)行界面一
6.3 運(yùn)行界面二
6.4 運(yùn)行界面三
7 檢索流程的實(shí)現(xiàn)
(1) 創(chuàng)建分析器對(duì)象(Analyzer), 用于分詞;
(2) 創(chuàng)建查詢對(duì)象(Query);
(3) 創(chuàng)建索引庫目錄位置對(duì)象(Directory), 指定索引庫的位置;
(4) 創(chuàng)建索引讀取對(duì)象(IndexReader), 用于讀取索引;
(5) 創(chuàng)建索引搜索對(duì)象(IndexSearcher), 用于執(zhí)行搜索;
(6) 使用IndexSearcher對(duì)象, 執(zhí)行搜索, 返回搜索結(jié)果集TopDocs;
(7) 處理結(jié)果集;
(8) 釋放資源.
7.1 使用Luke工具搜索
bookName:lucene —— 表示搜索bookName域中包含有l(wèi)ucene.
7.2 示例代碼
/*** 檢索索引功能的測試* @throws Exception */ @Test public void searchIndexTest() throws Exception {// 1. 創(chuàng)建分析器對(duì)象(Analyzer), 用于分詞Analyzer analyzer = new StandardAnalyzer();// 2. 創(chuàng)建查詢對(duì)象(Query)// 2.1 創(chuàng)建查詢解析器對(duì)象// 參數(shù)一:默認(rèn)的搜索域, 參數(shù)二:使用的分析器QueryParser queryParser = new QueryParser("bookName", analyzer);// 2.2 使用查詢解析器對(duì)象, 實(shí)例化Query對(duì)象Query query = queryParser.parse("bookName:lucene");// 3. 創(chuàng)建索引庫目錄位置對(duì)象(Directory), 指定索引庫位置Directory directory = FSDirectory.open(new File("/your_path/index"));// 4. 創(chuàng)建索引讀取對(duì)象(IndexReader), 用于讀取索引IndexReader indexReader = DirectoryReader.open(directory);// 5. 創(chuàng)建索引搜索對(duì)象(IndexSearcher), 用于執(zhí)行索引IndexSearcher searcher = new IndexSearcher(indexReader);// 6. 使用IndexSearcher對(duì)象執(zhí)行搜索, 返回搜索結(jié)果集TopDocs// 參數(shù)一:使用的查詢對(duì)象, 參數(shù)二:指定要返回的搜索結(jié)果排序后的前n個(gè)TopDocs topDocs = searcher.search(query, 10);// 7. 處理結(jié)果集// 7.1 打印實(shí)際查詢到的結(jié)果數(shù)量System.out.println("實(shí)際查詢到的結(jié)果數(shù)量: " + topDocs.totalHits);// 7.2 獲取搜索的結(jié)果數(shù)組// ScoreDoc中有文檔的id及其評(píng)分ScoreDoc[] scoreDocs = topDocs.scoreDocs;for (ScoreDoc scoreDoc : scoreDocs) {System.out.println("= = = = = = = = = = = = = = = = = = =");// 獲取文檔的id和評(píng)分int docId = scoreDoc.doc;float score = scoreDoc.score;System.out.println("文檔id= " + docId + " , 評(píng)分= " + score);// 根據(jù)文檔Id, 查詢文檔數(shù)據(jù) -- 相當(dāng)于關(guān)系數(shù)據(jù)庫中根據(jù)主鍵Id查詢數(shù)據(jù)Document doc = searcher.doc(docId);System.out.println("圖書Id: " + doc.get("bookId"));System.out.println("圖書名稱: " + doc.get("bookName"));System.out.println("圖書價(jià)格: " + doc.get("bookPrice"));System.out.println("圖書圖片: " + doc.get("bookPic"));System.out.println("圖書描述: " + doc.get("bookDesc"));}// 8. 關(guān)閉資源indexReader.close(); }7.3 測試結(jié)果
7.4 結(jié)果說明
(1) 索引庫中包含索引域和文檔域;
(2) 索引域保存索引數(shù)據(jù)(倒排索引), 用于索引;
(3) 文檔域中保存文檔數(shù)據(jù), 用于搜索獲取數(shù)據(jù).
7.5 IndexSearcher方法
| indexSearcher.search(query, n) | 根據(jù)Query搜索, 返回評(píng)分最高的n條記錄 |
| indexSearcher.search(query,filter,n) | 根據(jù)Query搜索, 添加過濾策略, 返回評(píng)分最高的n條記錄 |
| indexSearcher.search(query, n, sort) | 根據(jù)Query搜索, 添加排序策略, 返回評(píng)分最高的n條記錄 |
| indexSearcher.search(booleanQuery, filter, n, sort) | 根據(jù)Query搜索, 添加過濾策略, 添加排序策略, 返回評(píng)分最高的n條記錄 |
版權(quán)聲明
作者: 馬瘦風(fēng)
出處: 博客園 馬瘦風(fēng)的博客
您的支持是對(duì)博主的極大鼓勵(lì), 感謝您的閱讀.
本文版權(quán)歸博主所有, 歡迎轉(zhuǎn)載, 但請(qǐng)保留此段聲明, 并在文章頁面明顯位置給出原文鏈接, 否則博主保留追究相關(guān)人員法律責(zé)任的權(quán)利.
轉(zhuǎn)載于:https://www.cnblogs.com/shoufeng/p/9367789.html
總結(jié)
以上是生活随笔為你收集整理的Lucene 02 - Lucene的入门程序(Java API的简单使用)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Javascript中 toFixed
- 下一篇: Java多线程机制