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;
}
}
}
分享到:
相关推荐
《庖丁解牛 源码 for Lucene 2.4》是一份针对开源全文搜索引擎Lucene 2.4版本的深度解析资料。这个压缩包包含的文件名为"paoding-for-lucene-2.4",很可能是针对中文处理的Paoding Lucene库的源代码分析或扩展。...
《深入剖析Lucene:庖丁解牛分词法2.4版本》 在中文信息处理领域,Lucene作为一个强大的全文检索引擎库,扮演着至关重要的角色。然而,由于中文的复杂性,简单的英文分词策略无法满足需求,于是有了针对中文的分词...
《Lucene中文分词:庖丁解牛》 在信息技术高速发展的今天,全文搜索引擎已经成为网站内容...在实际项目中,结合“庖丁解牛”的精神,我们可以不断提升Lucene的中文分词效率,让搜索引擎更加智能化,更好地服务于用户。
总的来说,结合Apache Lucene与庖丁解牛,可以构建出强大的中文全文检索系统。在实际应用中,理解并熟练运用这两者的结合,将极大地提升你的文本处理能力,为用户提供更加智能、精准的搜索体验。
而"庖丁解牛"则为Lucene提供了针对中文的分词支持,使得开发者可以更好地处理中文文档,提高了搜索的准确性和效率。它的特点包括对中文词汇的精准识别,对新词的动态学习,以及对多音字、成语和网络用语的有效处理。...
实例是一个java实例,可直接导入到MyEclipse中...其中是lucene3.0整合了庖丁解牛分词法,添加了高亮显示。因为lucene3.0无法整合paoding-analysis.jar 所以我已经把paoding-analysis中的源码整合进来了避免无法整合问题
涉及的核心技术是Java Web开发中的几个关键组件,包括ExtJS 2.0前端框架,Spring、Struts2和Hibernate(SSH)后端框架,Oracle 10g数据库以及Lucene 2.4全文搜索引擎。 **ExtJS 2.0** 是一个用于构建富互联网应用...
《深入剖析:Lucene3与庖丁解牛中文分词器》 在信息技术飞速发展的今天,全文检索和...在实际操作中,结合标签“lucene 中文分词器 庖丁解牛 全文索引”,我们可以深入学习和实践,不断优化分词效果,提高用户体验。
doc.add(new TextField("content", "Lucene搜索示例", Field.Store.YES)); indexWriter.addDocument(doc); // 关闭IndexWriter indexWriter.close(); // 创建QueryParser QueryParser parser = new QueryParser(...
Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它提供了高级文本检索功能,广泛用于构建搜索引擎和其他需要高效全文检索能力的应用。本文将重点介绍 Lucene 2.4 版本的基本概念和使用方法,帮助...
lucene 2.4 jar lucene2.4版本的JAR包
总的来说,通过“Lucene加庖丁解牛测试类”,我们可以系统地学习和实践Lucene的各项功能,从而在实际项目中更好地利用这一强大的搜索引擎库。无论是初学者还是经验丰富的开发者,都能从中受益,提升自己的技能水平。
通过学习样例代码和阅读中文文档,你将能熟练掌握 Lucene 的基本操作,从而在自己的项目中实现高效的全文搜索功能。无论是初学者还是经验丰富的开发者,Lucene 都能提供丰富的工具和资源,帮助你提升搜索体验。
由于庖丁官方目前提供可下载尚不支持Lucene 3.0以上版本。因此作者对paoding进行重新编译,使其与最新Lucene 3.0.1版本适用。 Latest paoding 3.0.1 for lucene 3.0.1 使用说明: 先下载2.0.4的版本(h t t p : / ...
ictclas4j for lucene 2.4 任何人不得将此用于商业用途,仅限个人学习研究之用.该开源项目遵循Apache License 2.0
《Lucene 2.4与Nutch学习笔记:在多文本文档中搜索关键词》 Lucene是一个高性能、全文本搜索引擎库,它为开发者提供了在Java应用程序中实现全文搜索功能的基本工具。Nutch则是一个开源的网络爬虫项目,用于抓取...
"庖丁解牛"分词器可以方便地与Lucene进行集成,用于提升搜索系统的中文处理能力。在集成到Lucene 3.0版本时,由于版本间的接口和功能可能会有所变化,因此可能需要进行一些适应性修改。这通常涉及到调整配置文件、...
《使用Lucene最新版与庖丁解牛方法构建搜索引擎》 在信息技术日新月异的今天,搜索引擎已经成为了我们获取信息的重要工具。Apache Lucene是一个高性能、全文本搜索库,被广泛应用于各种搜索引擎的开发中。本文将...
最新庖丁解牛分词法的使用demo,支持Lucene3.3、3.4等3.0以上版本,庖丁解牛的分词包为自己编译生成的,之前的2.0的版本不能支持Lucene3.0以上版本,所以需要从svn下载最新的庖丁解牛源码,生成jar文件(我同样已...