利用Lucene将被索引文件目录中的所有文件建立索引
1、新建两个文件夹htm和index,其中htm中存放被索引的文件,index文件中存放建立的索引文件。
2、新建解析目录中所有文件的类,用来解析指定目录下的所有文件。
import java.io.File;
public class FileList {
private static final String
SEP="/";
private static StringBuffer sb=new
StringBuffer("");
public static String[] getFiles(File
file){//取得file目录中所有的文件
if(file.isDirectory()){//如果是目录则进一步迭代
File[]
fs=file.listFiles();
for(int
i=0;i<fs.length;i++){
getFiles(fs[i]);
}
}
else{
sb.append(file.getPath()+SEP);//输出文件
}
String
s=sb.toString();
return s.split(SEP);
}
public
static String[] getFiles(String path){
File file=new
File(path);
if(file.isDirectory()){
File[]
fs=file.listFiles();
for(int
i=0;i<fs.length;i++){
getFiles(fs[i]);
}
}
else{
sb.append(file.getPath()+SEP);
}
String
s=sb.toString();
return s.split(SEP);
}
public
static String getExt(File file){
String
ext=file.getName();
try
{
ext=ext.substring(ext.lastIndexOf(".")+1);
}
catch (Exception e)
{
ext="";
}
return
ext;
}
}
3、读取文件内容用来建立对此文件的索引,这里读取文件的所有字符,只支持文本文件,本文暂时没有对其他文档的支持,读者可以利用其他组件来解析其他复杂文档。
import java.io.BufferedReader;
import java.io.File;
import
java.io.FileReader;
public class FileText {
public static String getText(File
file){//获得文件的内容
StringBuffer sb=new
StringBuffer("");
try {
FileReader fr=new
FileReader(file);
BufferedReader br=new
BufferedReader(fr);
String
text=br.readLine();
while(text!=null){
sb.append(text);
text=br.readLine();
}
br.close();
}
catch (Exception e)
{
sb.append("");
}
return
sb.toString();
}
public static String getText(String
filename){
File file=new File(filename);
String
text="";
try
{
text=getText(file);
} catch (Exception e)
{
text="";
}
return
text;
}
}
4、利用Lucene建立索引文件,同时存入指定目录。
import java.io.File;
import java.io.IOException;
import
java.text.SimpleDateFormat;
import java.util.Date;
import
javax.swing.JOptionPane;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import
org.apache.lucene.document.Document;
import
org.apache.lucene.document.Field;
import
org.apache.lucene.index.IndexWriter;
import
org.apache.lucene.index.IndexWriterConfig;
import
org.apache.lucene.store.SimpleFSDirectory;
import
org.apache.lucene.util.Version;
public class LuceneIndexer {
public void createIndex(String
filesPath,String indexPath) throws IOException{
File path=new
File(indexPath);
SimpleFSDirectory indexDir=new
SimpleFSDirectory(path);//读取被索引的文件目录
CJKAnalyzer analyzer=new
CJKAnalyzer(Version.LUCENE_31);//创建一个二分法分析器
IndexWriterConfig
conf=new IndexWriterConfig(Version.LUCENE_31,
analyzer);
IndexWriter writer=new
IndexWriter(indexDir,conf);
String[]
files=FileList.getFiles(filesPath);//读取被索引的文件
for(int
i=0;i<files.length;i++){
File f=new
File(files[i]);
String
ext=FileList.getExt(f);
if(ext.equalsIgnoreCase("html")||ext.equalsIgnoreCase("htm")){//只建立网页文件的索引
Document
doc=new
Document();//新建一个索引文件用于索引当前html文件
//filename字段
String
filename=f.getName();
Field field=new
Field("filename",filename,Field.Store.YES,Field.Index.ANALYZED);
doc.add(field);
//uri字段
String
uri=f.getPath();
field=new
Field("uri",uri,Field.Store.YES,Field.Index.NO);
doc.add(field);
//cdate字段
Date
date=new Date(f.lastModified());
SimpleDateFormat
sdf=new SimpleDateFormat("yyyy-MM-dd E");
String
cdate=sdf.format(date);
field=new
Field("cdate",cdate,Field.Store.YES,Field.Index.NO);
doc.add(field);
//size字段
double
si=f.length();
String
size="";
if(si>1024){
size=String.valueOf(Math.floor(si/1024))+"K";
}
else{
size=String.valueOf(si)+"Bytes";
}
field=new
Field("size",size,Field.Store.YES,Field.Index.NO);
doc.add(field);
//text字段
String
text=FileText.getText(f);
field=new
Field("text",text,Field.Store.YES,Field.Index.ANALYZED);
doc.add(field);
//digest字段
String
digest="";
if(text.length()>200){
digest=text.substring(0,
200);
}
else{
digest=text;
}
field=new
Field("digest",digest,Field.Store.YES,Field.Index.ANALYZED);
doc.add(field);
//归入索引
writer.addDocument(doc);
}
}
writer.close();//关闭索引器
JOptionPane.showMessageDialog(null,
"索引建立完毕!","提示", JOptionPane.INFORMATION_MESSAGE);
}
}
5、测试
public class IndexerTest {
public static void main(String[] args) {
//
TODO Auto-generated method stub
LuceneIndexer indexer=new
LuceneIndexer();
try
{
indexer.createIndex("D:/我的文档/lucene/htm",
"D:/我的文档/lucene/index");
} catch (IOException e)
{
// TODO Auto-generated catch
block
e.printStackTrace();
}
}
}
(转自:http://blog.sina.com.cn/s/blog_69b6a7c60100wa4n.html)
利用Lucene将被索引文件目录中的所有文件建立索引的更多相关文章
- solr中通过SFTP访问文件建立索引
需求: 从oracle数据库中根据记录的文件名filename_html(多个文件以逗号隔开),文件路径path,备用文件名bakpath中获取 主机172.21.0.31上对应的html文件内容,并 ...
- 【mysql】mysql中单列索引、联合索引、Join联表查询建立索引 和 EXPLAIN的分析使用
2.创建联合索引,从坐到右分别为:userid.openId.name 2. #### -------------- 多表联合查询 update 2019/03/13 ------------ ...
- Oracle数据库中如何选择合适的索引类型 .
索引就好象一本字典的目录.凭借字典的目录,我们可以非常迅速的找到我们所需要的条目.数据库也是如此.凭借Oracle数据库的索引,相关语句可以迅速的定位记录的位置,而不必去定位整个表. 虽然说,在表中是 ...
- mysql建立索引,实际工作中建立索引的示例
1.根据业务场景建立相应的组合索引,一般是在主键,外键,常用来筛选查询的字段,按照字段之间组合的紧密程度,建立一定顺序的索引. 例如:为 t_org_exam_join_member_day 建立索 ...
- Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构
Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构 1. 索引的分类1 1.1. 按照存储结构划分btree,hash,bitmap,fulltext1 1.2. 索引的类型 按查找 ...
- Mysql数据库建立索引的优缺点有哪些?
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息. 什么是索引 数据库索引好比是一本书前面的目录,能加快数据库的查询速度. 例如这样一个查询:select * ...
- mysql 建立索引的原则(转)
索引查询是数据库中重要的记录查询方法,要不要进入索引以及在那些字段上建立索引都要和实际数据库系统的查询要求结合来考虑,下面给出实际中的一些通用的原则: 1. 在经常用作过滤器的字段上建立索引: 2. ...
- mysql 建立索引场合及索引使用
索引建立场合: ① where后边字段 适合建立索引 ② order by 排序字段适合建立索引 ③ 索引覆盖 即 所要查询的字段本身就是索引 直接在索引中查询数据. 例如 select name,a ...
- SQL Server 索引维护(1)——如何获取索引使用情况
前言: 在前面一文中,已经提到了三类常见的索引问题,那么问题来了,当系统出现这些问题时,该如何应对? 简单而言,需要分析现有系统的行为,然后针对性地对索引进行处理: 对于索引不足的情况:检查缺少索引的 ...
随机推荐
- docker 安装 gogs(go git server) 及问题解决
docker安装gogs 参考官方说明 gogs mysql 支持 运行一个mysql image docker run --name gogs-mysql -e MYSQL_ROOT_PASSWOR ...
- Python连接MySQL乱码(中文变问号)
#coding=utf-8 import MySQLdb db = MySQLdb.connect("IP","用户名","密码",&quo ...
- 转:JavaWeb学习总结(一) 写得相当不错
这个系列写的相当不错,浅显易懂,图文并茂 http://www.cnblogs.com/xdp-gacl/tag/JavaWeb%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93 ...
- java 问题汇总(总结,重点)若忘了可以看看{不定时更新}
在用到spring框架中时,场景如下 post 请求过去,对象接收不到参数的值(解决办法:考虑到在参数上加个@RequestBody 注解即可,有些没加的是框架帮忙处理了后默认接收的是json串) h ...
- SQL查询刚開始学习的人指南读书笔记(一)关系数据库和SQL介绍
PART I:Relational Databases and SQL Chapter2, Ensuring Your Database Structure IsSound. 数据库设计准则 什么是关 ...
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-人机界面如何修改界面皮肤
切换到视图管理器,然后可以切换皮肤,会有预览效果 更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/acetaohai123 我的在线论坛: ...
- 一张图片教会你写mysql 语句
MySQL的语句执行顺序 MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入 ...
- C++中string.find()函数与string::npos
先说说string::npos参数: npos 是一个常数,用来表示不存在的位置,类型一般是std::container_type::size_type 许多容器都提供这个东西.取值由实现决定,一般是 ...
- 在 .NET 4.0 下编写扩展代码以支持 async 异步编程
微软在C# 5中引入了async.await这两个异步编程的关键字,要使用这两个关键字需要你的IDE支持C#5.0语法,也就意味着你需要使用VS 2012版本以上IDE,或者在Vs2010卸载其编译器 ...
- 获取表数据的插入SQL
DECLARE @TABLE_NAME VARCHAR(200) SET @TABLE_NAME = 'myFunction' --表名 DECLARE @TABLE_CONDITION VARCHA ...