package com.searchtxt.lucene;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.TypeAttribute;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.LongField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Before;
import org.junit.Test;
import org.wltea.analyzer.lucene.IKAnalyzer;
/**
* txt文件索引
* @author lijunqing
*/
public class IndexFile {
private Directory directory;
private String indexPath = "D://lucene/index"; // 建立索引文件的目录
private String dirPath = "D://lucene/test"; // txt资源目录
private Analyzer analyzer = new IKAnalyzer();
private IndexWriter indexWriter;
@Before
public void init() {
try {
directory=FSDirectory.open(new File(indexPath));
indexWriter=getIndexWriter(directory);
} catch(Exception e) {
System.out.println("索引打开异常!");
}
}
/**
* 获得所有txt文件
* @param dirPath
* @return
*/
public List<File> getFileList(String dirPath) {
File[] files=new File(dirPath).listFiles();
List<File> fileList=new ArrayList<File>();
for(File file: files) {
if(isTxtFile(file.getName())) {
fileList.add(file);
}
}
return fileList;
}
/**
* 创建索引
* @throws Exception
*/
@Test
public void createIndex() throws Exception{
List<File> fileList = getFileList(dirPath);
Document document = null;
for(File file:fileList){
document = fileToDocument(file);
indexWriter.addDocument(document);
System.out.println("filename=="+document.get("filename"));
indexWriter.commit();
}
closeWriter();
}
/**
* 判断是否是txt文件
* @param fileName
* @return
*/
public boolean isTxtFile(String fileName) {
if(fileName.lastIndexOf(".txt") > 0) {
return true;
}
return false;
}
/**
* 将文件转换成Document对象
* @param file
* @return
* @throws Exception
*/
public Document fileToDocument(File file) throws Exception {
Document document=new Document();
document.add(new TextField("filename", file.getName(), Store.YES));
document.add(new TextField("content", getFileContent(file), Store.YES));
document.add(new LongField("size", file.getTotalSpace(), Store.YES));
return document;
}
/**
* 获得indexwriter对象
* @param dir
* @return
* @throws Exception
*/
public IndexWriter getIndexWriter(Directory dir) throws Exception {
IndexWriterConfig iwc=new IndexWriterConfig(Version.LUCENE_40, analyzer);
return new IndexWriter(dir, iwc);
}
/**
* 关闭indexwriter对象
* @throws Exception
*/
public void closeWriter() throws Exception {
if(indexWriter != null) {
indexWriter.close();
}
}
/**
* 读取文件内容
* @param file
* @return
* @throws Exception
*/
public String getFileContent(File file) throws Exception{
Reader reader = new InputStreamReader(new FileInputStream(file),"GBK");
BufferedReader br = new BufferedReader(reader);
String result ="";
while(br.readLine() != null){
result = result+"\n"+br.readLine();
}
br.close();
reader.close();
return result;
}
}
说明:lucene4.0中TextField()中reader参数那个源代码中是
public TextField(String name, Reader reader) {
super(name, reader, TYPE_NOT_STORED);
}
而TYPE_NOT_STORED的定义为:是默认不保存的。
所以就先读出文件的内容用:
public TextField(String name, String value, Store store) {
super(name, value, store == Store.YES ? TYPE_STORED : TYPE_NOT_STORED);
}
这个方法。
分享到:
相关推荐
Lucene4.0对索引结构进行了改进,采用了更紧凑的格式,减少了磁盘空间的占用,提高了查询速度。此外,它还支持多线程索引和查询,提升了并行处理能力。对于开发者而言,Lucene4.0提供了更丰富的API,使得构建全文...
《Lucene4.0实例详解》 Lucene是一款强大的全文搜索引擎库,被广泛应用于各种信息检索系统中。这里我们主要探讨的是Lucene 4.0版本的实例应用,旨在通过实际操作来理解其核心概念和功能。 一、Lucene基础 Lucene ...
本教程通过一个简单的demo,将深入讲解如何利用Lucene 4.0创建索引、删除索引以及进行有效搜索。以下是详细的知识点解析: 1. **Lucene简介** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发。它提供...
总之,Lucene 4.0 提供了强大的文本索引和搜索功能,让开发者能够轻松地在应用程序中集成高级搜索功能。这个简单的示例是理解其工作原理和实践操作的一个良好起点。通过深入研究并结合自己的需求,开发者可以构建出...
"IK Analyzer 2012FF_hf1_IK分词lucene4.0_源码" 提供的是IK分词器的一个特定版本,适用于Lucene 4.0,这在当时是一个相对老但仍然被一些项目依赖的版本。 分词是中文信息处理的关键步骤,它将连续的汉字序列分割成...
总的来说,IK Analyzer 2012FF_hf1+lucene4.0的组合提供了一套强大的中文全文检索解决方案,适用于需要处理大量中文文本的系统,例如企业级的信息检索平台、内容管理系统或者在线问答系统。使用这套组合,开发者可以...
IK Analyzer不仅支持基本的分词功能,还能够与流行的全文检索框架Apache Lucene紧密集成,尤其在提供的版本中,它已经兼容Lucene 4.0。 IK Analyzer的核心思想是通过词典分词和文法分词相结合的方式,以达到更好的...
首先,Lucene.NET 4.0是Apache Lucene项目的一个.NET版本,它实现了完整的Lucene搜索功能,包括索引、查询、排序和高亮显示等。Lucene.NET 4.0主要更新了对.NET Framework 4.0的支持,增强了性能,并引入了一些新的...
将盘古分词器与Lucene.NET 4.0结合使用,可以提升中文文本搜索的性能和准确性。首先,我们需要将盘古分词器的重新编译版本(如PanGu.dll)引入项目中,作为Lucene.NET的自定义Analyzer。这通常涉及到创建一个继承自`...
**Lucene 索引图形化界面工具 LukeAll 3.5~4.0** Lucene 是一个开源的全文搜索引擎库,它提供了强大的文本搜索功能,但其本身的接口设计是命令行或者编程式的,对于非开发人员或者在调试索引时可能会显得不太友好。...
2. 创建索引:这是Lucene的第一步,需要将待搜索的文本数据转换为索引。你可以创建一个`IndexWriter`对象,设置相应的目录(如内存或磁盘),然后使用`Document`对象表示每个文档,添加字段并分词。 3. 使用IK分词...
- Lucene 的核心功能是对文本数据进行索引和搜索。它可以接收任意数量的字符串,然后建立索引,当用户输入关键词时,返回包含关键词的文本位置。这种能力使得 Lucene 可以应用于各种场景,如站内新闻搜索、数据库...
在Lucene 4.0中,Segment Info格式有所变化,可能会与其他版本不兼容。 4. **字段信息(Fields)**:.fnm文件包含了所有字段的名称。每个文档的Field Data的地址和实际数据分别存储在.fdx和.fdt文件中,这允许快速...
**使用Lucene对数据库建立索引及搜索** Lucene是一个高性能、可伸缩的信息检索库,它是Apache软件基金会的顶级项目之一。它提供了一个简单但功能强大的API,用于在各种数据源上创建全文搜索引擎,包括数据库。在本...
《Luke:Lucene索引查看工具的深度解析》 在信息检索领域,Lucene作为一款强大的全文搜索引擎库,被广泛应用于各种数据检索系统。而Luke,全称Lucene Index Toolbox,是Lucene的一个辅助工具,它允许开发者和管理员...
在`src/core/org/apache/lucene/index`目录下,我们可以找到关于索引构建、读取和更新的相关类,如`IndexWriter`用于创建和更新索引,`DirectoryReader`用于读取索引。 2. 查询解析器:查询字符串转换为可执行的...
《盘古分词与Lucene 3.0.3在.NET 4.0中的应用实践》 盘古分词和Lucene是两个在文本处理和信息检索领域中至关重要的工具。盘古分词,作为一款优秀的中文分词系统,能够高效准确地对中文文本进行分词,为后续的数据...
在"luceneDemo4.0"中,你将会看到以上概念的具体应用,包括创建索引、执行查询、高亮展示结果以及调整排序逻辑的示例代码。通过实践这个项目,你不仅可以了解Lucene的基本操作,还能学习到如何在实际项目中优化搜索...
3. **文档索引**:使用Lucene的IndexWriter对象,将包含分词后的文本的Document对象写入索引库。每个Document对象代表一个待检索的文档,可以包含多个Field,如标题、内容等。 4. **查询执行**:构建Query对象,...