XHuiLin 2009-04-24
package org.heming.sucene.test; import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.Date; import java.util.List; 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.index.CorruptIndexException; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.queryParser.MultiFieldQueryParser; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocCollector; import org.apache.lucene.store.LockObtainFailedException; public class LucenePaoDing { private static final String indexPath = "f/何明/heming/le"; /** * * @param args */ public static void main(String[] args) { rebuildAll(); String keyword = "3"; LucenePaoDing lucene = new LucenePaoDing(); System.out.println("索引搜索\n-----------------------------------------"); System.out.println(lucene.searcherIndex(keyword)); } private synchronized Analyzer getAnalyzer() { return new StandardAnalyzer(); } public static void rebuildAll() { synchronized (indexPath) { LucenePaoDing lucene = new LucenePaoDing(); Connection con = null; Statement stt = null; ResultSet rs = null; String sql ="select T2SMI001,T2SMI002,T2SMI003,T2SMI004 from T_2SYSMENU_INF"; try { con = DBConnection.getConnection(); stt = con.createStatement(); rs = stt.executeQuery(sql); System.out.println(sql); if (rs.next()) { lucene.Index(rs); } } catch (Exception e) { e.printStackTrace(); } finally { if (con != null) try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } } private synchronized void Index(ResultSet rs) { // 通过结果集获得数据源 try { IndexWriter writer = new IndexWriter(indexPath, getAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED); writer.setMaxFieldLength(10000000); long start = new Date().getTime(); int index = 1; while (rs.next()) { Document doc = new Document(); // 一个文档相当于一个表的记录 doc.add(new Field("T2SMI001", rs.getString("T2SMI001"), Field.Store.YES, Field.Index.NOT_ANALYZED)); // 字段T2SMI001是数据库表中的T2SMI001,lucene的一条记录的一个字段下的数据可以放多个值,这点与数据库表中不同 doc.add(new Field("T2SMI002", rs.getString("T2SMI002"), Field.Store.YES, Field.Index.NOT_ANALYZED)); // doc.add(new Field("T2SMI003", rs.getString("T2SMI003"), // Field.Store.YES, Field.Index.NOT_ANALYZED)); doc.add(new Field("T2SMI004", rs.getString("T2SMI004"), Field.Store.YES, Field.Index.NOT_ANALYZED)); writer.addDocument(doc); if (index++ == 1000) { writer.commit(); index = 0; } } writer.commit(); writer.optimize(); // 优化 writer.close(); // 一定要关闭,否则不能把内存中的数据读取到文件 long end = new Date().getTime(); System.out.println("重建索引成功!!!" + "用时" + (end - start) + "毫秒"); } catch (Exception e) { e.printStackTrace(); } } public void IndexSigle(long T2SMI001,String T2SMI002,String T2SMI004){ //通过结果集就可以获得数据源了 synchronized(indexPath){ try { IndexWriter writer = new IndexWriter(indexPath,getAnalyzer(),false,IndexWriter.MaxFieldLength.UNLIMITED); writer.setMaxFieldLength(100000000); long start = new Date().getTime(); Document doc = new Document(); doc.add(new Field("T2SMI001",Long.toString(T2SMI001),Field.Store.YES,Field.Index.NOT_ANALYZED));// 字段id放的是数据库表中的id,lucene的一条记录的一个字段下的数据可以放多个值,这点与数据库表不同 doc.add(new Field("T2SMI002",T2SMI002,Field.Store.YES,Field.Index.NOT_ANALYZED)); // doc.add(new Field("T2SMI003",T2SMI003,Field.Store.YES,Field.Index.NOT_ANALYZED)); doc.add(new Field("T2SMI004",T2SMI004,Field.Store.YES,Field.Index.NOT_ANALYZED)); writer.addDocument(doc); // writer.optimize(); //优化 writer.close(); long end = new Date().getTime(); // System.out.println("重建索引成功!!!" + "用时" + (end - start) + "毫秒"); } catch (CorruptIndexException e) { e.printStackTrace(); } catch (LockObtainFailedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } /** * 最主要的搜索方法. * @param queryString * @return */ public List<Long> searcherIndex(String queryString){ //根据关键字搜索 try{ IndexSearcher searcher = new IndexSearcher(indexPath); /*下面这个表示要同时搜索这两个域,而且只要一个域里有满足我们搜索的内容就行了*/ BooleanClause.Occur[] clauses = {BooleanClause.Occur.SHOULD,BooleanClause.Occur.SHOULD}; TopDocCollector collector = new TopDocCollector(10); Query query = MultiFieldQueryParser.parse(queryString,new String[]{ "T2SMI002","T2SMI004" },clauses,getAnalyzer()); searcher.search(query,collector); ScoreDoc[] hits = collector.topDocs().scoreDocs; List<Long> list = new ArrayList<Long>(); long id; int docId; for(int i = 0; i < hits.length; i++){ docId = hits[i].doc; Document doc = new Document(); id = Long.parseLong(doc.get("T2SMI001").trim()); if(!list.contains(id)){ list.add(id); } } searcher.close(); return list; }catch(Exception e){ e.printStackTrace(); return null; } } }