- 浏览: 183529 次
- 性别:
- 来自: 北京
-
最新评论
-
u011374223:
获取颜色的方法有两个,07xssfWORKBOOK的需要用这个 ...
apache poi读取excel中的颜色,真是坑爹啊 -
zhangtcb:
读取的颜色和Excel中的不一样啊
apache poi读取excel中的颜色,真是坑爹啊 -
LD_21:
...
log4j日志文件的相对路径 -
xfxlch:
upThx
来,让我们一起画个印章吧 -
xinxinlong:
单元格的style里面有个颜色,如果双击单元格,里面的文字选中 ...
apache poi读取excel中的颜色,真是坑爹啊
项目做的很杂,又用到了lucene对特定文件的内容进行搜索,检查特定词汇。
经过查资料,看demo,实验,终于写出来了。
ps:网上的资料大部分很老啊,类老是对不上号。
先建立索引
import java.io.File; import java.io.FileFilter; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.util.HashSet; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.store.LockObtainFailedException; import org.wltea.analyzer.lucene.IKAnalyzer; import vrvclient.util.ConfigUtil; import vrvclient.util.FileListUtil; /** * * @author lan */ public class Indexer extends Constants { private static final Log log = LogFactory.getLog(Indexer.class); public void index(File[] files, FileFilter filter) { if (files == null) { return; } // System.out.println(filter.getClass()); Set<File> set = new HashSet<File>(); for (File f : files) {//过滤掉不合要求的文件,如后缀,文件名等 FileListUtil.list(f, filter, set); } File indexDir = new File(ConfigUtil.getIndexPath());//这里是获得索引文件的保存路径的 Analyzer analyzer = new IKAnalyzer();//使用国产的IK分词器,很好很强大 try { FSDirectory dir = FSDirectory.open(indexDir);//保存到硬盘上 IndexWriter iw = new IndexWriter(dir, analyzer, !IndexReader.indexExists(dir), IndexWriter.MaxFieldLength.LIMITED); for (File f : set) { if (f.isFile()) { // System.out.println(f.getAbsolutePath()); Document doc = new Document(); Reader reader = new FileReader(f); doc.add(new Field(PATH, f.getAbsolutePath(), Field.Store.YES, Field.Index.ANALYZED));//保存路径 doc.add(new Field(FILE, reader));//保存文件 iw.addDocument(doc); reader.close(); } } iw.optimize(); iw.close(); } catch (CorruptIndexException ex) { log.error(ex.getMessage(), ex); } catch (LockObtainFailedException ex) { log.error(ex.getMessage(), ex); } catch (IOException ex) { log.error(ex.getMessage(), ex); } } }
这个是搜索结果
import java.io.File; import java.io.IOException; import java.util.HashSet; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.document.Document; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.FSDirectory; import org.wltea.analyzer.lucene.IKAnalyzer; import vrvclient.util.ConfigUtil; /** * * @author lan */ public class Searcher extends Constants { private static final Log log = LogFactory.getLog(Indexer.class); /** * * @param contents * @param combineMode true = and,false = or * @param limit -1=all */ public Set<String> search(String[] contents, boolean combineMode, int limit) { Set<String> paths = new HashSet<String>(); try { File indexDir = new File(ConfigUtil.getIndexPath()); FSDirectory fsd = FSDirectory.open(indexDir); IndexSearcher is = new IndexSearcher(fsd, true); Analyzer analyzer = new IKAnalyzer(); if (fsd.getFile().exists()) { QueryParser qp = new QueryParser(FILE, analyzer); StringBuilder sb = new StringBuilder(); String jioner = ""; if (combineMode) {//如果是and,则所有条件要同时满足 jioner = "+"; } boolean b = true; for (String s : contents) { s = s.replaceAll("\\s+", " AND ");//防止条件中的空格被看成“或”,把其变成“与” if (!b) { sb.append(" "); } sb.append(jioner).append("(").append(s).append(")"); b = false; } Query q = qp.parse(sb.toString()); log.info(q.toString()); if (limit == -1) { limit = is.maxDoc(); } TopDocs hits = is.search(q, limit); ScoreDoc[] sds = hits.scoreDocs; for (int i = 0; i < sds.length; i++) { ScoreDoc sd = sds[i]; Document doc = is.doc(sd.doc); // System.out.println("Hit:(" + sd.score + ")" + doc.toString()); //本来想同时得到命中次数,也就是词频,但是网上找到的都是老版本的,这里不能用。 paths.add(doc.get(PATH));//返回匹配的路径 } } is.close(); } catch (ParseException ex) { log.error(ex.getMessage(), ex); } catch (IOException ex) { log.error(ex.getMessage(), ex); } return paths; } }
附用到的工具类:
import java.io.File; import java.io.FileFilter; import java.util.Map; import java.util.Set; /** * * @author lan */ public final class FileListUtil { //返回一定数量的符合要求的文件 public static void list(File f, FileFilter filter, Set<File> set, int limit) { if (limit > -1 && set.size() >= limit) { return; } if (f == null) { return; } if (f.isFile()) { set.add(f); } else if (f.isDirectory()) { File[] files = null; if (filter == null) { files = f.listFiles(); } else { files = f.listFiles(filter); } if (files != null) { for (File file : files) { list(file, filter, set, limit); } } } } //返回所有的符合要求的文件,不要担心set放不上,至少我的D盘资料盘都放进去都没有内存溢出 public static void list(File f, FileFilter filter, Set<File> set) { if (f == null) { return; } if (f.isFile()) { set.add(f); } else if (f.isDirectory()) { File[] files = null; if (filter == null) { files = f.listFiles(); } else { files = f.listFiles(filter); } if (files != null) { for (File file : files) { list(file, filter, set); } } } } //其实是打包工具类用到的 public static void list(File f, FileFilter filter, String parent, Map<String, File> map) { if (f == null) { return; } String name = f.getName(); if (parent != null) { name = parent + "/" + name; } if (f.isFile()) { map.put(name, f); } else if (f.isDirectory()) { File[] files = null; if (filter == null) { files = f.listFiles(); } else { files = f.listFiles(filter); } if (files != null) { for (File file : files) { list(file, filter, name, map); } } } } }
常量类,大部分人用接口,但是我不太喜欢用接口来保存常量,虽然更方便点,但是不合规范。
public class Constants {//可以替换成枚举,没必要了 protected static final String PATH = "path"; protected static final String FILE = "file"; }
发表评论
-
公约数,公倍数和素数的简单计算
2012-04-01 16:08 1347为自己留作备份,省得用到的时候再去寻找 简单的计算最大公约数 ... -
java简单打印
2012-03-08 09:56 1243没什么,就是一个简单的打印,留作存档 publi ... -
httpclient4的封装
2012-01-06 15:11 4656没什么特别的,自己封装着用的. package cpcns. ... -
h2的baseDir
2011-11-11 16:38 1474使用h2 1.3.161.在web项目中.计划在Listene ... -
eclipse下自动打包项目并部署到web项目的lib下
2011-10-18 15:59 5130修改web项目的.settings下的org.eclipse. ... -
获取汉字的五笔,全拼和双拼的工具类
2011-10-10 15:51 2414如题,项目需要,首先可用的自然是pinyin4j. 在不考虑 ... -
五笔86和汉字对照表
2011-10-09 16:53 2546项目要用到汉字转拼音和五笔,拼音容易,使用pinyin4j. ... -
java System属性
2011-09-19 10:14 1395自定义 : java -Dname=value S ... -
log4j日志文件的相对路径
2011-09-01 10:51 6824一直没能很好的解决log4j的日志文件的保存路径.今天恰好又遇 ... -
Apache codec中的base64
2011-07-20 09:46 2297一直使用sun的base64,但是感觉不是很好,毕竟不是标准包 ... -
来,让我们一起画个印章吧
2011-07-04 14:52 4555这几天发现有哥们在介 ... -
svg中的arc转化为java中的arc
2011-05-27 15:31 2697最近项目需要解析svg中的path.直线和贝塞尔曲线都好办,唯 ... -
swing的拖拽(dnd)的简单实现
2011-03-28 10:18 2023这几天项目需要用到dnd,API比较麻烦.在网上找了很多,都只 ... -
自用的MD5计算工具
2011-03-11 15:45 1792/** * 检查输入流的MD5值是否符合.如果MD5为 ... -
用jsoup分析下载巨鲸的mp3
2011-02-25 15:37 1738这两天突然想听听杰克逊的歌.首选当然是巨鲸. 支持正版. ... -
获取子类的泛型参数
2011-01-27 16:03 1369用的时候不好找,今天看nutz的dao的源码看到了,摘出来备份 ... -
简单的通过注解运行的dao
2011-01-26 11:47 1805项目是个老项目,是个比较简单,但是编码比较凌乱的项目.数据库字 ... -
java模拟js的escape和unescape函数
2011-01-05 10:43 3477这个是在网上找的代码,然后修改了下.作用标题已经很明显了. ... -
自己写的多线程对象池
2010-12-10 16:53 1330/** * 排版器的一个公用接口 <br> ... -
apache poi读取excel中的颜色,真是坑爹啊
2010-12-01 16:23 17002工作原因,需要使用poi来读取excel中的所有内容. 其他 ...
相关推荐
**Lucene 2.9 API 深度解析** Lucene 是一个开源的全文检索库,由Apache软件基金会开发并维护。它为开发者提供了一种高效、可扩展的搜索引擎架构,使得在各种应用中实现复杂的全文搜索功能成为可能。本文将深入探讨...
《深入理解Lucene 2.9 API:全方位剖析与应用》 Lucene是一个高性能、全文检索库,由Apache软件基金会开发并维护。它为开发者提供了一个简单可扩展的接口,用于在各种数据存储中实现全文索引和搜索功能。本文将深入...
**Lucene.NET 2.9 搜索引擎源代码解析** Lucene.NET 是一个基于 Apache Lucene 的全文搜索引擎库,它是用 C# 实现的。Apache Lucene 是一个高性能、可扩展的信息检索库,广泛用于构建复杂的搜索功能。Lucene.NET ...
在"DesktopSearch1"这个项目中,可能包含了一个简单的桌面搜索应用,这个应用使用Lucene.NET 2.9进行索引和搜索,同时利用Highlighter插件来高亮显示搜索结果。开发者可能已经对原版的Lucene.NET和Highlighter插件...
此外,它还提供了一个简单的API,使得开发者可以方便地集成到自己的应用中。 总之,Lucene-2.9.2是一个功能强大的全文检索库,它的中文分词能力和TF-IDF搜索引擎设计,使得开发者能够构建高效、准确的信息检索系统...
在这个实例中,我们将深入探讨如何使用Lucene.NET 2.9.2来实现索引的生成、修改、查询和删除。 **一、索引生成** 首先,我们需要创建一个索引,这是全文检索的基础。在Lucene.NET中,我们通常会定义一个文档类,...
作为Java编写的一个开源项目,Lucene为开发者提供了强大的文本检索功能,使得开发全文搜索引擎变得简单易行。在本文中,我们将深入探讨Lucene 2.4.1版本中的核心概念、架构以及其实现的全文搜索技术。 一、Lucene...
- **5.1 建立索引的一个简单例子**: 提供一个简单的示例来演示如何使用Lucene创建索引。 - **5.2 理解索引中的核心类**: 解释Lucene中用于索引操作的主要类的作用。 - **5.2.1 IndexWriter**: 用于创建和更新索引。...
| 3.2.0G及后续版本 | 兼容Lucene2.9及3.0版本 | 仅对solr1.4提供接口实现 | 请注意参考对应的版本使用手册以确保正确使用。 ##### 2.3 安装部署 IKAnalyzer的安装包包含了《IKAnalyzer中文分词器V3.X使用手册》...
9.4 初步使用lucene全文搜索组件 9.5 新闻搜索引擎具体实现 9.6 小结 第10章 在线网上支付(jsp+servlet+javabean) 10.1 在线网上支付原理 10.2 在线网上支付功能工具类 10.3 发出支付请求过程 ...
**2.9 Riak** Riak是一个高度可用的分布式NoSQL数据库,支持数据复制和故障恢复。它采用键值存储方式,支持多种数据类型。 **2.10 ZooKeeper** ZooKeeper是一个分布式协调服务,用于管理和维护分布式系统的元数据...