- 浏览: 142835 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
ling凌yue月:
Yes,it's good!
JavaScript实现ReplaceAll 方法 -
lj1214388:
请问楼主,我导入了struts-jquery-plugin 的 ...
Jquery Ui 日期控件
导言:
如果要对整个数据库做精确查询或模糊查询,我们怎么才可以做到?还是通过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
发表评论
-
Goole 地图 根据经纬度获取地址
2012-12-10 22:40 829package com.jueyue; import jav ... -
百度地图根据地址获取经纬度
2012-12-10 21:31 8436package com.jueyue; import jav ... -
Java对象的序列化和反序列化实践
2012-12-10 19:52 648当两个进程在进行 ... -
HttpClient 实现访问 HTTPS
2012-11-08 11:24 0避免HttpClient的”javax.net.ssl.SSL ... -
实现一个线程池
2012-05-17 22:40 799public class SjgxrwStartQuest e ... -
通过 HttpClient 下载 文件
2011-10-27 13:49 1009需要有的Jar; * commons-httpclie ... -
Java 文件拷贝
2011-10-26 18:26 783public static void saveFiles(S ... -
生成jar文件的方法
2011-10-13 01:20 716JAR --Java Archive File,顾 ... -
文件下载
2011-08-30 13:58 712public ModelAndView downloadFil ... -
根据Map 动态生成一个类 动态打印
2011-07-15 23:28 909import java.lang.reflect.Field; ... -
Java实现类排序
2011-07-12 16:07 898用Java实现类排序 如下步骤: 1 待排序的类实现 ... -
web service(axis)例子HelloService步骤说明
2011-07-12 11:36 9601.将axis1.1目录下webapps下的axis包拷贝到t ... -
解决一台机器同时运行多个Tomcat服务
2011-07-12 10:07 882如果不加任何修改,在一台服务器上同时运行两个Tomcat服务显 ... -
Java 解析 Word Word 中的表格
2011-07-04 22:15 4376import java.io.File; import ... -
Java 解析 PDF, pdfbox读取PDF内容
2011-07-04 20:59 6362import java.io.ByteArrayOutputS ... -
Java 页面表格导出Word
2011-06-21 10:28 1767StringBuffer sb = new StringBuf ... -
Java 页面表格导出Word
2011-06-21 10:25 1325StringBuffer sb = new StringBuf ... -
Java Mail 收发邮件
2011-06-15 22:24 855import javax.mail.Address;impor ... -
Java对象序列化
2011-03-09 22:47 722被序列化的类要implements Serializab ... -
JavaScript 为Select添加节点
2011-03-01 09:53 973function addOption(){ var ...
相关推荐
1. **数据抽取**:首先,我们需要从SQL Server数据库中获取需要建立索引的数据。这通常通过JDBC(Java Database Connectivity)驱动实现,编写Java代码连接数据库并执行查询,获取所需字段。 2. **预处理**:数据...
在这个"lucene与数据库连接进行查询"的主题中,我们主要探讨如何将 Lucene 与 JDBC(Java Database Connectivity)结合,通过数据库连接来获取数据并利用 Lucene 进行处理。 首先,我们需要了解如何使用 JDBC 连接...
- **数据库集成**: 通过JDBC或其他方式将数据库中的数据导入Lucene索引,实现高效全文检索。 - **联合查询(Hybrid Search)**: 结合SQL查询与Lucene的全文搜索,提供更强大的搜索能力。 综上所述,Lucene提供了...
【Lucene结合Sql建立索引】是将数据库中的数据通过Lucene这个全文搜索引擎进行索引,以便快速查询和检索的一种技术。在这个商业源码中,我们可能会看到如何使用Java编程语言来实现这样一个功能。Lucene是Apache软件...
在这个场景中,我们讨论的是如何结合Lucene和MySQL来实现一个Java应用程序,该程序能够从MySQL数据库中提取数据,创建索引,并进行高效的搜索。 首先,我们需要理解Lucene的工作原理。Lucene通过分析文本,将文档...
通过以上步骤,我们可以利用Lucene对数据库中的数据进行全文检索,极大地提高了查询速度,降低了服务器负载,尤其在处理大量数据时效果显著。需要注意的是,Lucene虽然强大,但其主要负责文本搜索,对于数据库中非...
JDBC是Java访问数据库的标准接口,用于与各种数据库建立连接,执行SQL语句和获取结果。在这个搜索引擎项目中,JDBC主要用于存储和检索索引数据。开发者可能需要创建数据库表来存储索引信息,并通过JDBC进行数据的...
2. **数据库集成**:学习如何将MySQL中的数据导入到Lucene的索引中,可能涉及JDBC连接、SQL查询等知识。 3. **索引创建**:了解如何使用Lucene的Analyzer对数据进行分词,创建索引,包括字段设置、分析器选择等。 ...
《利用Lucene进行数据库检索》 Lucene是一款强大的全文搜索引擎库,广泛应用于各种搜索场景,包括Web搜索引擎、论坛搜索、C/S架构的搜索等。其核心优势在于能够高效地建立索引,实现快速的数据检索。本文将详细介绍...
在本文中,我们将探讨如何使用Lucene来操作数据库,特别是在MS SQL Server 2000环境下,对Authors表进行全文索引并实现查询。 1. 数据库操作与Lucene集成 传统上,我们使用JDBC(Java Database Connectivity)来与...
在上述文档中,我们看到如何利用 Lucene 来对 MS SQL Server 2000 中的数据库进行全文索引,并创建查询功能。 1. **建立索引** - 首先,你需要编写一个传统的 JDBC 程序来从数据库中读取数据。这涉及到建立数据库...
MyBatis则是一个轻量级的持久层框架,它解决了JDBC的繁琐工作,允许开发者用XML或注解定义SQL语句,与数据库交互。MyBatis与Spring的整合,可以实现事务管理,提高了开发效率。 接下来是Redis,它是一款高性能的...
MyBatis是一个持久层框架,它简化了数据库操作,避免了传统的JDBC代码编写。MyBatis支持SQL动态语句,可以方便地编写复杂查询。它将SQL语句与Java代码分离,使得数据库访问更加灵活和易于维护。 **4. Lucene** ...
在这个项目中,我们看到开发者利用Lucene结合jdbcTemplate来封装API,并引入缓存机制,以实现索引的精确刷新。这是一项高级的技术实践,旨在提高系统的响应速度和数据一致性。 首先,让我们详细了解一下Lucene。...
这里,我们看到作者尝试将数据库中的数据(可能是MySQL)通过Lucene API建立索引,以便进行快速检索。 描述中提到,这个示例非常基础,旨在帮助读者理解如何将Lucene与MySQL结合使用。这通常涉及从数据库读取数据,...
总之,这个项目实例涵盖了从数据库获取新闻数据,使用Lucene进行文本处理、索引构建、搜索执行,到最后的关键词高亮显示等一系列步骤,全面展示了如何在Java项目中有效利用Lucene实现全文搜索引擎。通过学习和实践...