`
bob_abc_keeny
  • 浏览: 5957 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Lucene 3.2 具体实现

阅读更多
package lucene;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.DateTools;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
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.Directory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;

public class T2 {

@SuppressWarnings("deprecation")
public void index(String indexDir, String dataDir)
throws CorruptIndexException, LockObtainFailedException,
IOException, ParseException {
// 设置分词版本
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_32);
// 存储在内存
// Directory directory = new RAMDirectory();

// 存储在硬盘
Directory directory = new SimpleFSDirectory(new File(indexDir));

/* 这种方式是最新的,但是不能删除以前的索引 */
// IndexWriter writer = new IndexWriter(directory, new
// IndexWriterConfig(
// Version.LUCENE_32, analyzer));
IndexWriter writer = new IndexWriter(directory, analyzer, true,
IndexWriter.MaxFieldLength.UNLIMITED);

// document.add(new Field("fieldname", text, Field.Store.YES,
// Field.Index.ANALYZED));

File sourceFile = new File(dataDir);
File[] files = sourceFile.listFiles();
for (File file : files) {
Document document = new Document();
// document.add(new Field("contents", new FileReader(file)));
document.add(new Field("filename", file.getName(), Field.Store.YES,
Field.Index.ANALYZED));
document.add(new Field("indexDate", DateTools.dateToString(
new Date(), DateTools.Resolution.DAY), Field.Store.YES,
Field.Index.ANALYZED_NO_NORMS));
document.add(new Field("fileSize", (file.length() / 1024) + "k",
Field.Store.YES, Field.Index.ANALYZED_NO_NORMS));
document.add(new Field("filePath", file.getAbsolutePath(),
Field.Store.YES, Field.Index.ANALYZED_NO_NORMS));
document.add(new Field("contents", getComtent(file),
Field.Store.YES, Field.Index.ANALYZED_NO_NORMS));
writer.addDocument(document);
}
System.out.println("索引数目: " + writer.numDocs());
writer.close();
directory.close();
}

public String getComtent(File file) throws IOException {
InputStreamReader reader = new InputStreamReader(new FileInputStream(
file));
BufferedReader br = new BufferedReader(reader);
StringBuilder sb = new StringBuilder();
String tem = null;
while ((tem = br.readLine()) != null) {
sb.append(tem + "\n");
}
return sb.toString();
}

/**
*
* @param indexDir
*            索引目录
* @param type
*            类型,1,内容,2.文件名称
* @param vlue
*            要查询的内容
* @throws IOException
* @throws ParseException
*/
public void search(String indexDir, int type, String vlue)
throws IOException, ParseException {
Directory dir = new SimpleFSDirectory(new File(indexDir));
// 创建 IndexSearcher对象,相比IndexWriter对象,这个参数就要提供一个索引的目录就行了
IndexSearcher indexSearch = new IndexSearcher(dir);
// 创建QueryParser对象,第一个参数表示Lucene的版本,第二个表示搜索Field的字段,第三个表示搜索使用分词器
QueryParser queryParser = null;
if (type == 1) {
queryParser = new QueryParser(Version.LUCENE_30, "contents",
new StandardAnalyzer(Version.LUCENE_30));
} else {
queryParser = new QueryParser(Version.LUCENE_30, "filename",
new StandardAnalyzer(Version.LUCENE_30));
}
// 生成Query对象
Query query = queryParser.parse(vlue);// 设置查询语句
// 搜索结果 TopDocs里面有scoreDocs[]数组,里面保存着索引值
TopDocs hits = indexSearch.search(query, 10);
// hits.totalHits表示一共搜到多少个
System.out.println("找到了" + hits.totalHits + "个");
// 循环hits.scoreDocs数据,并使用indexSearch.doc方法把Document还原,再拿出对应的字段的值
for (int i = 0; i < hits.scoreDocs.length; i++) {
ScoreDoc sdoc = hits.scoreDocs[i];
Document doc = indexSearch.doc(sdoc.doc);
// System.out.println(doc.get("filename"));
// System.out.println(doc.get("fileSize"));
System.out.println(doc.get("filePath"));
// System.out.println(doc.get("contents"));
}
indexSearch.close();

}

public static void main(String[] args) throws CorruptIndexException,
LockObtainFailedException, IOException, ParseException {
T2 t2 = new T2();
String indexDir = "D:\\lucene\\index";
String dataDir = "D:\\lucene\\data";
// t2.index(indexDir, dataDir);
t2.search(indexDir, 1, "真正的主人");

}
}
分享到:
评论

相关推荐

    一种基于Lucene检索引擎的全文数据库的研究与实现

    ##### 3.2 Lucene的工作原理 Lucene通过将文档转化为索引的形式来提高检索效率。具体来说,它的主要工作流程包括以下几个步骤: - **索引创建**:首先,Lucene会将文档内容解析成一系列的词条(Token),并对这些...

    开放源代码的全文检索引擎Lucene.pdf

    - **Lucene 2.2**、**Lucene 3.2** 等:指的是Lucene的不同版本号,每个版本都可能带来新的特性、改进和修复。 - **Java API**:Lucene提供了一套丰富的Java API,以方便Java开发者使用。文档中也提到了一些具体的包...

    IKAnalyzer3.2(稳定版)分词

    在IKAnalyzer3.2的压缩包文件中,"org"目录可能包含了IKAnalyzer的核心代码库,组织结构遵循Java的标准包命名规则,如`org IKAnalyzer.core`和`org IKAnalyzer.util`等,这些包包含了分词器的实现类、工具类以及与...

    Lucene+原理与代码分析完整版

    《Lucene原理与代码分析》全面解析 Lucene是一个开源的全文搜索引擎库,由Apache...本文仅对Lucene做了基础介绍,实际应用中,开发者还需要根据具体需求对Lucene进行深度学习和实践,以充分利用其功能并解决实际问题。

    lucene的封装和性能优化

    Lucene是一个高性能、全文本搜索库,它为开发者提供了在应用程序中实现全文检索的功能。然而,为了更好地适应实际项目需求,通常需要对其进行封装,以便于管理和提升性能。本文将深入探讨Lucene的封装方法以及如何...

    基于Lucene的中文分词方法设计与实现

    ##### 3.2 正向最大匹配算法的实现 正向最大匹配算法(Forward Maximum Matching, FMM)是中文分词中的一种常见方法。在基于Lucene的中文分词模块设计中,该算法被优化并加入了歧义消除的功能。具体来说,FMM算法...

    Lucene 3.6 学习笔记

    本文将深入探讨Lucene 3.6版本中的关键概念、功能以及实现方法。 ### 第一章 Lucene 基础 #### 1.1 索引部分的核心类 - `Directory`: 用于存储索引数据的抽象接口,例如FSDirectory(文件系统目录)和RAMDirectory...

    lucene配置必备文件JAVA-CC

    随着对`JavaCC`的理解加深,可以尝试将其应用到Lucene的具体项目中,提升Lucene的灵活性和适应性。 7. **升级与兼容性** 虽然`javacc-3.2`较老,但其核心概念和使用方法与新版本大同小异。在实际项目中,考虑使用...

    lucene笔记

    #### 二、Lucene实现全文检索的流程 **2.1 索引流程** - **采集数据**: 获取需要被索引的原始文档数据。 - **构建文档对象**: 将原始数据转化为Lucene可以处理的对象形式。 - **分析文档**: 对文档进行分词处理,...

    Lucene使用教程

    - **自定义分析器**:根据具体需求定制的分析器,可以通过组合多个TokenFilter实现更复杂的功能。 **3.2 文档(Document)** 文档是Lucene中最小的数据单元,它是由一组字段组成的集合。每个字段都可以指定不同的...

    Lucene In Action second edition

    - **第 8 章:案例研究——实现高级功能**:介绍了一些高级特性,如高亮显示、模糊匹配、地理位置搜索等,并给出具体实现方案。 - **第 9 章:案例研究——大规模部署与维护**:讨论了在生产环境中部署 Lucene 应用...

    基于Lucene与Heritrix的图书垂直搜索引擎的研究与实现.pdf

    通过对图书信息进行分词处理、建立索引,Lucene能够实现高效的文本检索,支持复杂的查询语法,从而提供更加快捷、精准的搜索体验。 #### 3.3 搜索系统的优化 搜索系统是用户与垂直搜索引擎交互的主要界面,其性能...

    Lucene2实战源码

    Lucene2是一款由Apache软件基金会开发的全文搜索引擎库,它是Java语言实现的开源项目,广泛应用于信息检索、数据分析等领域。本篇将基于提供的"Lucene2实战源码"进行深入探讨,帮助读者了解Lucene的核心原理以及在...

    《开发自己的搜索引擎-Lucene 2.0 Heritrix》cd(全)(下载地址)

    - **高效性**:通过优化的数据结构和技术实现,Lucene 2.0能够快速地索引和检索大量数据。 - **可扩展性**:支持索引各种不同类型的数据,如文本、数字等,并且可以轻松地扩展到处理更大规模的数据集。 - **高度可...

    lucene and pdfbox

    在3.2版本中,Lucene已经相当成熟,提供了稳定的搜索性能和丰富的功能。 **PDFBox** PDFBox是Apache软件基金会的一个项目,专为处理PDF文档提供Java API。它能够读取、创建、更新和打印PDF文档,并且支持对PDF文档...

    lucene基本使用,适合初学者

    ##### 3.2 全文检索需求实现 以下是一段简单的示例代码,演示如何使用Lucene创建索引并进行检索: ```java public class LuceneExample { private void createIndex(String indexPath) throws Exception { // ...

    lucene索引

    它提供了一个高性能、可扩展的信息检索框架,使得开发者能够轻易地在应用中实现全文搜索功能。本篇文章将深入探讨 Lucene 创建索引的过程以及如何使用 Lucene 进行高效的全文搜索。 ### 1. Lucene 的基本概念 ####...

Global site tag (gtag.js) - Google Analytics