利用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解析及轻量级PaaS平台演练(三)--Dockerfile编写
在本篇中将介绍Dockerfile的编写 除了通过修改Image,创建Container,在打包成Image来创建我们需要的Image之外 我们还可以编写Dockerfile文件,通过build来创建 ...
- 更改Eclipse下Tomcat的部署目录
转自:http://kingxss.iteye.com/blog/1741438 前言 今天tomcat启动就报错,后来查原因是因为异常关闭tomcat的原因,需要删除一个sessions.ser的文 ...
- docker实战——构建Jekyll
构建第一个应用 要构建的第一个应用是Jekyll框架的自定义网站.我们会构建一下两个镜像. 一个镜像安装Jekyll以及其他用于构建Jekyll网站的必要的软件包. 一个镜像通过Apache来让Jek ...
- DriverStore文件夹特别大,能删除吗?
DriverStore文件夹特别大,能删除吗? DriverStore\FileRepository文件夹特别大,能删除吗? C:\Windows\System32\DriverStore\FileR ...
- 单用户模式下mount -o remount,rw / 有大用途
我们的Linux系统在无法启动时候,通常需要进入单用户模式下进行修改一些配置文件,或调整一些参数方可.但是在进入单用户模式后,我们的/文件系统是只读模式,无法进行修改,那么这个时候我们就需要用到一条命 ...
- java泛型 7 泛型的基本介绍和使用
现在开始深入学习Java的泛型了,以前一直只是在集合中简单的使用泛型,根本就不明白泛型的原理和作用.泛型在java中,是一个十分重要的特性,所以要好好的研究下. 一.泛型的基本概念 泛型的定义:泛型是 ...
- atitit.MyEclipse10 中添加svn插件故障排除
atitit.MyEclipse10 中添加svn插件故障排除 删除\configuration \org.eclipse.update 不行... 二. 在configuration下的config ...
- iOS开发-重写description方法,自定义控制台(log)信息
description是所有类都有的一个方法. 我们重写这个方法,可以自定义实例输出的信息. 比如我们创建一个Person类: 在.h文件中添加两个属性: #import <Foundation ...
- Linux-信号详解
1.Linux支持的所有信号: $ kill -l ) SIGHUP ) SIGINT ) SIGQUIT ) SIGILL ) SIGTRAP ) SIGABRT ) SIGBUS ) SIGFPE ...
- lua面向对象编程 《lua程序设计》 16章 笔记
Lua中的table就是一种对象,即它拥有状态.拥有独立于其值的标识(self).table与对象一样具有独立于创建者和创建地的征集周期 什么叫对象拥有独立的生命周期? Account = {bala ...