/**
* Project Name:docsearch
* File Name:Index.java
* Package Name:cn.tramp.docsearch.index
* Date:2014年2月27日 下午5:10:15
* Copyright (c) 2014, zhangzhaoyu0524@163.com All Rights Reserved.
*
*/
package cn.tramp.docsearch.index;
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.document.DateTools;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.DateTools.Resolution;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.LongField;
import org.apache.lucene.document.StringField;
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 cn.tramp.docsearch.dao.IDocumentMapper;
import cn.tramp.docsearch.domain.DocumentInfo;
import cn.tramp.docsearch.util.IndexPropertyUtil;
import cn.tramp.docsearch.util.PdfUtil;
/**
* ClassName:Index <br/>
* Function: Index. <br/>
* Reason: Index. <br/>
* Date: 2014年2月27日 下午5:10:15 <br/>
* @author zhangzhaoyu
* @version
* @since JDK 1.7
* @see
*/
public class Index {
private final static Log logger = LogFactory.getLog(Index.class);
private Directory directory;
private String indexPath;
private String docmentPath;
private IDocumentMapper mapper;
/**
*
* 构造的时候初始化 indexPath 和 directory
*
*/
public Index() {
try {
indexPath = IndexPropertyUtil.getKeyValueByName("indexPath");
docmentPath = IndexPropertyUtil.getKeyValueByName("docmentPath");
directory = FSDirectory.open(new File(indexPath));
} catch (IOException e) {
e.printStackTrace();
logger.info("init Index class error");
}
}
private IndexWriter getIndexWriter() throws IOException {
// 标准分词器 一元分词
//Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);
Analyzer analyzer = new SmartChineseAnalyzer(Version.LUCENE_43);
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_43, analyzer);
// 设置缓冲区大小
iwc.setRAMBufferSizeMB(3);
return new IndexWriter(directory, iwc);
}
private IndexWriter getIndexWriter(Analyzer analyzer) throws IOException {
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_43, analyzer);
// 设置缓冲区大小
iwc.setRAMBufferSizeMB(3);
return new IndexWriter(directory, iwc);
}
public void index(List<DocumentInfo> docList, boolean flag) {
IndexWriter writer = null;
try {
writer = getIndexWriter();
if (flag) {
writer.deleteAll();
logger.info("delete all");
writer.commit();
}
for (DocumentInfo docInfo : docList) {
Document doc = new Document();
doc.add(new StringField("doc_id", docInfo.getDoc_id().toString(), Store.YES));
doc.add(new TextField("doc_name", docInfo.getDoc_name(), Store.YES));
doc.add(new StringField("doc_type", docInfo.getDocType().getType_name(), Store.YES));
String docContent = "";
if (docInfo.getDocType().getType_name().equals(".pdf")) {
//doc.add(new TextField("content", docInfo.getDoc_name(), Store.YES));
docContent = PdfUtil.getPdfContent(docmentPath + docInfo.getDoc_location());
} else {
docContent = this.getFileContent(docInfo.getDoc_location());
//doc.add(new TextField("content", docContent, Store.YES));
}
//String docContent = PdfUtil.getPdfContent(docmentPath + docInfo.getDoc_location());
doc.add(new StringField("content", docContent, Store.YES));
doc.add(new StringField("doc_location", docInfo.getDoc_location(), Store.YES));
doc.add(new StringField("add_datetime", DateTools.dateToString(docInfo.getAdd_datetime(), Resolution.DAY), Store.YES));
doc.add(new StringField("modify_datetime", DateTools.dateToString(docInfo.getModify_datetime(), Resolution.DAY), Store.YES));
doc.add(new StringField("upload_author", docInfo.getUpload_author(), Store.YES));
doc.add(new StringField("author", docInfo.getAuthor(), Store.YES));
writer.addDocument(doc);
}
writer.forceMerge(1);
writer.commit();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
*
* close:<br />
* 关闭Derectory
*
* @author zhangzhaoyu
*/
public void close() {
try {
this.directory.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private String getFileContent(String filePath) throws IOException {
String fileAbPath = this.docmentPath + filePath;
return FileUtils.readFileToString(new File(fileAbPath), "utf-8");
}
public IDocumentMapper getMapper() {
return mapper;
}
public void setMapper(IDocumentMapper mapper) {
this.mapper = mapper;
}
}
分享到:
相关推荐
**标题:“Lucene建立索引”** **描述分析:** Lucene是一个开源的全文检索库,由Apache软件基金会开发。它的主要功能是提供高效的文本搜索引擎,尤其在处理大量数据时,其性能表现突出。倒排索引是Lucene实现搜索...
在建立索引时,Lucene会对输入的文档进行分析,将其拆分成一个个的词汇,并为每个词汇创建一个倒排表,记录该词汇出现在哪些文档以及在文档中的位置信息。lucene-core-3.0.0.jar是Lucene的核心库,包含了构建和查询...
《Lucene全文检索:简单索引与搜索实例详解》 Lucene是Apache软件基金会的开源项目,是一款强大的全文检索库,被广泛应用于Java开发中,为开发者提供了构建高性能搜索引擎的能力。在本文中,我们将深入探讨如何基于...
**Lucene创建索引与搜索"java"关键字的示例代码** Apache Lucene是一个高性能、全功能的文本搜索引擎库,广泛应用于各种系统中用于实现高效、精准的全文检索功能。这个示例代码将向我们展示如何使用Lucene来创建一...
全文检索的关键在于通过建立索引,将原本非结构化的文本数据转化为结构化的表示,使得搜索过程可以高效进行。在Lucene中,这个过程包括分析文本、创建倒排索引等步骤,使得搜索操作从线性时间复杂度转变为对数时间...
《Lucene实战 第2版 》基于Apache的Lucene 3 0 从Lucene核心 Lucene应用 案例分析3个方面详细系统地介绍了Lucene 包括认识Lucene 建立索引 为应用程序添加搜索功能 高级搜索技术 扩展搜索 使用Tika提取文本 Lucene...
2. **索引构建的灵活性**:建立索引的方法并非固定不变,可以根据自己的需求和理解来设计。Lucene的核心原理是将数据转换为可搜索的索引结构。尽管可以借鉴他人的实现,但最好理解其原理,以便根据实际情况调整。 3...
### Lucene对XML文档建立索引的技术解析与实践 #### 一、引言 随着互联网技术的迅猛发展,非结构化数据(如XML文档)在企业和组织中的应用日益广泛。如何高效地处理这些非结构化的数据,特别是进行快速检索成为了一...
**建立索引的步骤** 1. **添加依赖**:在MyEclipse10中,首先需要导入Lucene相关的jar包,这些通常包括lucene-core、lucene-analyzers、lucene-queryparser等,确保所有必要的组件都已引入。 2. **创建索引目录**...
主要将如何使用Lucene建立索引以及搜索进行了代码的实现,有利于初学者熟悉Lucene的基本功能。
本源码演示了Lucene结合Sql建立索引,把Sql中的数据通过建立索引用Lucene来检索 【该源码由51aspx提供】 源码 " onerror="this.src='/images/ifnoimg.gif'" src="/uploads/allimg/090904/1039152O5-0.jpg...
**基于Lucene技术的增量索引** 在信息技术领域,全文搜索引擎是处理大量数据查询的关键工具。Apache Lucene是一个开源的全文检索库,被广泛应用于构建高效、可扩展的搜索功能。本文将深入探讨如何利用Lucene实现...
iTextPDFExtractor.java ------ ...--PDFBox创建PDF文件的Lucene索引 PDFBoxPathIndex.java ------- --PDFBox创建指定目录PDF文档索引 POIOfficeExtractor.java ----- -- POI处理Excel和Word文档代码
7. **写入Document并建立索引**:调用`IndexWriter.addDocument()`方法将Document写入索引。 8. **优化索引**:`IndexWriter.optimize()`可以合并索引段,提高查询性能。 9. **关闭索引写入器**:完成所有操作后,...
数据库和Lucene建立索引都是为了查找方便,但是数据库仅仅针对部分字段进行建立,且需要把数据转化为格式化信息,并予以保存。而全文检索是将全部信息按照一定方式进行索引。 Lucene的架构设计主要包括两块:一是...
在Lucene中,索引过程包括分词、建立倒排索引以及存储相关元数据。倒排索引是Lucene的核心,它允许快速定位包含特定词汇的文档。搜索则通过查询解析、评分以及结果排序来实现,提供高效的检索性能。 2.2.3 Web...
例如,可以创建一个简单的文件搜索程序,将文件内容作为输入,利用Lucene建立索引,并实现快速搜索功能。 Lucene 8.5.2还引入了一些新特性,如支持更多语言的分词器,增强了对JSON和CSV等数据格式的处理能力,以及...
1. 三种方案:直接抓取网页内容后通过Lucene建立索引;中间层处理,抓取后存储到数据库,再由Lucene索引数据库;直接索引抓取的原始HTML。 2. 文件存储格式:通常采用倒排索引(Inverted Index)结构,便于快速查找...