利用lucene对整个数据库建立索引(lucene,SQL,JDBC)(

导言:

如果要对整个数据库做精确查询或模糊查询,我们怎么才可以做到?还是通过SQL查询吗?答案是否定的。因为,通过SQL对整个数据库做精确查询或模糊查询,速度将非常的慢;

lucene解决了这个问题。通过对表或者文本文件预先建立索引,可以很快的实现全文检索。

思路:

1、通过SQL得到所有表名的集合---->2、遍历所有的表,分别为每个表的每个记录建立索引;同时添加表的中文名以及表的说明的索引---->按Writer\analyzer\document\field的循序建索引。

package com.jrj.datamart.tree;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Writer;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
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.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.util.Version;
//import com.jrj.datamart.model.ApiIndicator;
//import com.jrj.datamart.model.ApiInfo;
//import com.jrj.datamart.model.ApiInfoQuery;
//import com.jrj.datamart.service.ApiInfoService;


//对整个数据库的建立索引;并给每个表添加,表的说明和字段的中文名;方便查询
//索引 Lucene 3.0.2
public class IndexerDB {

 // 保存索引文件的地方
 private static  String INDEX_DIR = "F:\\MyLuceneDB2\\LuceneFileIndexDir";
 private String index_dir;
 private File file=new File(INDEX_DIR);
 // 将要搜索TXT文件的地方
 private String data_dir;
 private String DATA_DIR = "F:\\Lucene";
 private String entityName;
// private ApiInfo apiInfo;
// private ApiInfoQuery apiInfoQuery = new ApiInfoQuery();
// private ApiInfoService apiInfoService;
// private List<ApiIndicator> apiIndicators = new ArrayList<ApiIndicator>();
// private ApiIndicator apiIndicator;
 private StringBuilder newsb = new StringBuilder();
 private ResultSet rs = null;
 private ResultSet tempRs = null;
 private ResultSetMetaData rsmd = null;
// private SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer(
//   Version.LUCENE_30, true);
 private Document doc;
 private String tableName;

 public static void main(String[] args) throws Exception {
  IndexerDB indexDB=new IndexerDB();
        File file=new File(INDEX_DIR);
  //1
  indexDB.execute(file);
 }
 

//执行对数据库的索引化
//@param file
//@return
// @throws Exception
//  
 public String execute(File file) throws Exception {
  long start = new Date().getTime();
  //2
  int numIndexed=getAllTableNameFromDBAndIndexing(file);
  long end = new Date().getTime();
  System.out.println("Indexing " + numIndexed + " files took "
   + (end - start) + " milliseconds");
  return "success";
 }
 
// 查询所有的表,并遍历所有的表;
//调用getDataFromTable(tableName)获取表的记录;
//调用indexData(writer, rs, tableName)对单张表做索引
 public int getAllTableNameFromDBAndIndexing(File file)throws Exception {
  ResultSet rs=null;
  String sql1 = null;
  String sql2 = null;
  sql1 = "select [name] from [sysobjects] where [type] = 'u' order by [name]";
  sql2 = "show tables";
  SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer(
    Version.LUCENE_30, true);
  IndexWriter writer = new IndexWriter(FSDirectory.open(file),
    analyzer, true, IndexWriter.MaxFieldLength.LIMITED);
  try {
   rs = JDBCUtil.execute(sql1);
  } catch (Exception e) {
   rs = JDBCUtil.execute(sql2);
  }
  while (rs.next()) {
   
   tableName=rs.getString(1);
   System.out.println("tableName: "+rs.getString(1));
   //ResultSetMetaData rsmd = rs.getMetaData(); 
   ResultSet tempRs=getDataFromTable(tableName);
   System.out.println("already get data of table");
   indexData(writer, tempRs, tableName);
  }
  int numIndexed = writer.numDocs();
  writer.optimize();
  writer.close();
  return numIndexed;
 }
   
 // 取得表的数据
 public ResultSet getDataFromTable(String tableName) throws Exception {
  String sql = "select * from " + tableName;
  System.out.println(""+sql);
  //String sql = "select * from " + "HK_STKCODE";
  return JDBCUtil.execute(sql);
 }
 
//对特定表的记录,采用特定writer,索引
//该方法是lucene的indexer的关键方法
//writer---->document---->field
 private void indexData(IndexWriter writer, ResultSet rs, String tableName)
   throws Exception{
  if (rs == null) {
   return;
  }
  // 取得实体名
  //System.out.println("tableName: " + tableName);
  entityName = getEntityName(tableName);
  System.out.println(" .entityName: " + entityName);
  while (rs.next()) {
   doc = new Document();
   rsmd = rs.getMetaData();
   int colsNum = rsmd.getColumnCount();
   //System.out.println("colsNum: "+colsNum);
   for (int i = 1; i < colsNum + 1; i++) {
   String  columnName=rsmd.getColumnName(i);  
   //System.out.println("columnName: "+columnName);
   //System.out.println(" rs.getString(i): "+ rs.getString(i));
   // 1、对该条记录的第一个字段进行索引
    doc.add(new Field(columnName, (rs.getString(i)==null?"":rs.getString(i)),
      Field.Store.YES, Field.Index.ANALYZED));
   }
// 2、在此处添加,表的说明(description);来至于apiinfo;根据表对应的实体名,找到表对应的apiinfo实体
//   apiInfoQuery.setEntityname(entityName);
//   apiInfo = apiInfoService.gainApiInfoByEntityName(entityName);
//   if (apiInfo != null) {
//    doc.add(new Field("apiDesc", apiInfo.toString(), Field.Store.YES,
//      Field.Index.ANALYZED));
//   }
// 3、在此处添加,表的中英文字段:
// 来自于apiindicator;根据表对应的实体名,去APIINFO中取找apiid,再去apiindicator中找apiindicator的实体
//   List<ApiIndicator> apiIndicators = apiInfoService
//     .gainApiIndicatorsByApiId(apiInfo.getId());
//   // 输出指标和描述结合为字符串
//   for (int i = 0; i < apiIndicators.size(); i++) {
//    apiIndicator = apiIndicators.get(i);
//    newsb.append(apiIndicator.getCnname() + " ")
//      .append(apiIndicator.getEnname() + " ")
//      .append(apiIndicator.getDescription() + "");
//    newsb.append("\n");
//   }
//   System.out.println("newsb.toString(): " + newsb.toString());
//   doc.add(new Field("outputFields", newsb.toString(),
//     Field.Store.YES, Field.Index.ANALYZED));
// 4、文件名
   doc.add(new Field("apiName", entityName,
     Field.Store.YES, Field.Index.ANALYZED));
   writer.addDocument(doc);
  }
 }

 

  //将表名通过字符串处理成为实体名
 public String getEntityName(String tableName) {
  // tableName = tableName.substring(0, tableName.indexOf(".txt"));
  StringBuilder sb = new StringBuilder();
  // 将"_"替换掉,如果有的话,以便处理成与API对应的实体一样的字符串。如:PUB_SEITGC.txt,RSH_RSHRPT_INDFO.txt
  if (tableName.indexOf("_") != -1) {
   String[] subStrings = tableName.split("_");
   for (int i = 0; i < subStrings.length; i++) {
    sb.append(subStrings[i]);
   }
   return sb.toString();
  } else {
   return tableName;
  }
 }

 public String getIndex_dir() {
  return index_dir;
 }

 public void setIndex_dir(String index_dir) {
  this.index_dir = index_dir;
 }

 public String getData_dir() {
  return data_dir;
 }

 public void setData_dir(String data_dir) {
  this.data_dir = data_dir;
 }

// public ApiInfoService getApiInfoService() {
//  return apiInfoService;
// }
//
// public void setApiInfoService(ApiInfoService apiInfoService) {
//  this.apiInfoService = apiInfoService;
// }

}

 

// 数据库查询类

//JDBCUtil用于取得连接;JDBCUtil.execute(sql)用于执行SQL,并返回resultset.

package com.jrj.datamart.tree;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtil {

 public static Connection conn = null;
 // 建立连接
 static void getConntion() {
  try {
   String driver_class = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
   // ?useUnicode=true&characterEncoding=utf-8
   String connection_url = "jdbc:sqlserver://localhost:1433;DatabaseName=UDM";
   String user_name = "sa";
   String db_password = "sa";
   Class.forName(driver_class);
   conn = DriverManager.getConnection(connection_url, user_name,
     db_password);
   conn.setAutoCommit(false);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 // 查询后,得到数据
 public static ResultSet execute(String sql) throws Exception {
  // 取得连接
  getConntion();
  // 写SQL
  // 得到一个statment对象
  Statement stmt = conn.createStatement();
  // 得到一个结果集
  return stmt.executeQuery(sql);
 }

 static void close() {
  if (conn != null) {
   try {
    conn.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }
 }

 public static Connection getConn() {
  return conn;
 }

 public static void setConn(Connection conn) {
  JDBCWriteExcel.conn = conn;
 }
}

 

 

文章出自:http://blog.sina.com.cn/s/blog_4f9ce8f30100nt5r.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
索引擎设计软件程序源码+数据库+WORD毕业设计论文文档. 经过对搜索引擎的研究同时与Lucene自身的特性相结合,搜索引擎的设计与实现需要实现的功能阐述如下: (1)支持桌面文件搜索,格式包括txt、doc、xls和ppt; (2)支持分词查询 (3)支持全文搜索 (4)能够高亮显示搜索关键字 (5)显示查询所用的时间 (6)显示搜索历史、过滤关键字 目 录 目 录 IV 1 绪论 1 1.1 项目背景 1 1.2 国内外发展现状及分类 2 1.3 本论文组织结构介绍 3 2 相关技术介绍 5 2.1什么是搜索引擎 5 2.2 sqlserver数据库 6 2.3 Tomcat服务器 7 3 搜索引擎的基本原理 8 3.1搜索引擎的基本组成及其功能 8 3.2搜索引擎的详细工作流程 11 4 系统分析与设计 14 4.1系统分析 14 4.2系统概要设计 14 4.2系统实现目标 15 5 系统详细实现 16 5.1实现环境配置 16 5.2功能实现 16 5.2.1 建立索引 16 5.2.2 文件搜索实现 18 5.2.3 数据库的连接配置 20 5.2.4 数据库搜索实现 20 5.2.5 后台数据编辑实现 22 6 系统测试 24 6.1测试重要性 24 6.2测试用例 25 结 论 27 参 考 文 献 28 致 谢 29 1 绪论 1.1 项目背景 环球信息网(World Wide Web),即3W,一般在计算机与信息行业用Web这个词汇来来表示,万维网是它进入中国时所赋予的称呼,其实,这就是一个资料的汇集与存储的空间。 在这个空间中,以事物为单位,一个事物也可以称为一样“资源”,利用URL来标识,统一资源标识符”(URL。这些资源通过超文本传输协议(Hypertext Transfer Protocol,HTP)传送给终端用户,其中给到用户手上的是一个个链接,然后用户通过逐层点击链接,就可以查看到资源,也可以获得到资源。   万维网也常常被人们误以为是因特网的近义词,在这里必须要表明的概念是:万维网与因特网存在着本质的区别。因特网(Internet)是指,把全世界所有的各类型电脑,利用网络连接,所形成的硬件框架,这是一个实实在在的“网”。万维网,其本质是一种功能,即让使用者光看网络页面,而页面之间又交相辉映,从而让使用者觉得这也是一种“网”,但这种网是虚拟的,是不存在的。 可以说1994年在信息时代是一个重大突破的一年,因为万维网(World Wide Web)出现了。在这一改变之前,人们的信息获取方式还是通过各种传统文化传媒,相对于万维网来说是很传统、笨拙的,它在开放性和广泛的可访问性极大的激励了人们创作的积极性。所以万维网的出现极大的缩短了人们信息获取的时间,同时信息的时效性也得到了保障。万维网一出现就收到了全世界各国人的追捧,人们在它出现的十几年的一个时间段中,就在万维网这一平台上发布了几十亿条的网页信息,他的一个数据量是那么的庞大,粗略计算一下,万维网上的网页信息每天都会不断增长几十万。因为网络化、数字化的信息资源,所以网络信息也是有利有弊:利的一面是提高了我们的信息量;不利的一面是庞大的信息一并向我们开来,犹如破堤的江水,汹涌澎湃,造成了我们无所适从。 关于搜索引擎的由来,北美加拿大(Canada)的麦吉尔大学就必须要介绍一下了,早在上世纪,90年代之初,由于网络资源众多,分散性特别大,人们在找资料的时候特别费力。麦吉尔大学的团队也意识到了这个问题,所以他们就研发出了Archie,这是一个可以自动运行的系统,可以完成在FTP上搜集有用资源的作用。该系统定期会自动搜索FTP系统上保存的文档名以及相关的资源,而且还可以自行分析,如果有客户端发出搜索请求,该系统会根据搜索请求的内容,自动提供保存在主机中文件。在以Web网页为对象的搜索引擎系统的大背景下,搜索引擎被人们当做了在网上查找信息的重要手段,通过搜索引擎系统人们可以在浩瀚的网络海洋中第一时间找到自己真正想要的信息,并且搜索引擎的智能以及现在网页的特性使得人们只要输入相关的词语(即关键词)就可以找到相关的信息。 现如今,人们看到的百度、Google取得的显著成效,可以说是成为了行业的领头羊,所以整个世界也都把视觉一部分放置在了搜索引擎这一领域当中,各种各样的搜索服务犹如雨后春笋一般争相冒出。搜索引擎不仅种类愈来愈多,而且其服务的质量也越来越全面,从最初期的国外的Google引擎、Yahoo引擎,到如今的中国的Baidu引擎、360引擎等等。随着web技术的不断完善,网络信息资源也是翻倍增长的(变化关系是成正比的)。所以为了满足用户的需要,既可以快速的找到到资源,而且还可以提高资源的质量,各类型的引

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值