Lucene 4.10 + Mysql 5.5 創建數據庫表索引(Lucene 學習序列1)

Lucene 4.10 + Mysql 5.5 創建數據庫表索引(Lucene 學習序列1)

          Lucene是apache軟件基金會4 jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,即它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語言)。

     Code:

    

package com.qiuzhping.lucene;

/*
 * System Abbrev :
 * system Name  :
 * Component No  :
 * Component Name:
 * File name     :QueryDataFromDb.java
 * Author        :Peter.Qiu
 * Date          :2015年7月28日
 * Description   :  <description>
 */

/* Updation record 1:
 * Updation date        :  2015年7月28日
 * Updator          :  Peter.Qiu
 * Trace No:  <Trace No>
 * Updation No:  <Updation No>
 * Updation Content:  <List all contents of updation and all methods updated.>
 */

import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;
import java.util.UUID;

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.index.CorruptIndexException;
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.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

/**
 * <Description functions in a word>
 * <Detail description>
 * 
 * @author  Peter.Qiu
 * @version  [Version NO, 2015年7月28日]
 * @see  [Related classes/methods]
 * @since  [product/module version]
 */
public class QueryDataFromDb {
	private Directory directory = null;
	private static boolean insertFlag = true;
	public static Connection getConnection() throws SQLException,
			java.lang.ClassNotFoundException {
		String url = "jdbc:mysql:///hpsdb";
		Class.forName("com.mysql.jdbc.Driver");
		String userName = "root";
		String password = "123456";
		Connection con = DriverManager.getConnection(url, userName, password);
		return con;
	}
	
	public static void insertData() throws ClassNotFoundException, SQLException{
		Connection conn = getConnection();
		Statement st = conn.createStatement();
		Random random = new Random();
		for(int j = 0 ; j < 10 && insertFlag; j ++){
			StringBuffer sql = new StringBuffer("insert student (name,math) values");
			for(int i = 0 ; i < 100000 ; i++){
				String uuid = UUID.randomUUID().toString().replaceAll("-", "");
				sql.append("('" + uuid + "'," + random.nextInt(100) + "),");
			}
			String insert = sql.toString().substring(0, sql.length() - 1);
			st.execute(insert);
		}
		st.close();
		conn.close();
	}
	
	public void index() throws SQLException, ClassNotFoundException, IOException {
		IndexWriter writer = null;
		try {
			directory = FSDirectory.open(new File("C:/lucene/index02"));
			Analyzer analyzer = new StandardAnalyzer();
			IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_4_10_4,
					analyzer);
			conf.setOpenMode(OpenMode.CREATE_OR_APPEND);
			conf.setMaxBufferedDocs(100);
			writer = new IndexWriter(directory, conf);
			insertFlag = false;
			insertData();
			Connection conn = getConnection();
			Statement st = conn.createStatement();
			long count = 1;
			for(int i = 0 ; i < 10; i ++){
				String query = "select * from student limit "+ i * 100000+","+ 100000;
				ResultSet result = st.executeQuery(query);
				while (result.next()) {
					Document document = new Document();
					document.add(new StringField("id", result.getString("id"),
							Field.Store.YES));
					document.add(new StringField("name", result
							.getString("name"), Field.Store.YES));
					document.add(new StringField("math", result
							.getString("math"), Field.Store.YES));
					writer.addDocument(document);
					count ++;
				}
			}
			
			System.out.println("Total record : "+count);
			writer.close();
			st.close();
			conn.close();
		} finally {
			try {
				if (writer != null) {
					writer.close();
				}
			} catch (CorruptIndexException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	
	public IndexSearcher getSearcher() throws IOException {
		IndexReader reader = DirectoryReader.open(directory);
		IndexSearcher searcher = new IndexSearcher(reader);
		return searcher;
	}
	
	public void searchByTerm(String field, String name, int num) throws IOException {
		IndexSearcher searcher = getSearcher();
		// WildcardQuery 模糊查找
		// TermQuery 精確查找
		Query query = new TermQuery(new Term(field, name));
		TopDocs tds = searcher.search(query, num);
		System.out.println("count:" + tds.totalHits);
		for (ScoreDoc sd : tds.scoreDocs) {
			Document doc = searcher.doc(sd.doc);
			System.out.println("id:" + doc.get("id"));
			System.out.println("name:" + doc.get("name"));
			System.out.println("math:" + doc.get("math"));
		}
	}
	
	public static void main(String[] args) throws ClassNotFoundException,
			SQLException, IOException {
		QueryDataFromDb indexUtil = new QueryDataFromDb();
		indexUtil.index();
		int i = 0 ;
		long start = System.currentTimeMillis();
		//查找前90分前2名的信息
		System.out.println("查找前90分前2名的信息");
		indexUtil.searchByTerm("math", "90", 2);
		System.out.println(i+" Spend time:"+(System.currentTimeMillis() - start) + " ms");
	}
}

測試的結果是:

Total record : 1000001
查找前90分前2名的信息
count:36212
id:298904
name:636ab6012e4b429ea54d176f28f5fa1c
math:90
id:299156
name:085af1feb39b42f0be1c6e9f3f814526
math:90
0 Spend time:805 ms


涉及到Lucene 核心包鏈接:http://mirrors.hust.edu.cn/apache/lucene/java/4.10.4/

代碼片段涉及到:

lucene-analyzers-common-4.10.4.jar

lucene-core-4.10.4.jar

lucene-queryparser-4.10.4.jar

mysql-connector-java-5.1.35.jar


發佈了87 篇原創文章 · 獲贊 376 · 訪問量 50萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章