`

lucene中FSDirectory、RAMDirectory的用法

 
阅读更多

package com.ljq.directory;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.NumberTools;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Filter;
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.FSDirectory;
import org.apache.lucene.store.RAMDirectory;
import org.junit.Test;

public class DirectoryTest {
// 数据源路径
String dspath = "F:\\android\\luceneprj\\luceneds\\IndexWriter addDocument's a javadoc .txt";
//存放索引文件的位置,即索引库
String indexpath = "F:\\android\\luceneprj\\luceneindex";
//分词器
Analyzer analyzer = new StandardAnalyzer();

/**
* 创建索引,会抛异常,因为没对索引库进行保存
*
* IndexWriter 用来操作(增、删、改)索引库的
*/
@Test
public void createIndex() throws Exception {
//Directory dir=FSDirectory.getDirectory(indexpath);
//内存存储:优点速度快,缺点程序退出数据就没了,所以记得程序退出时保存索引库,已FSDirectory结合使用
//由于此处只暂时保存在内存中,程序退出时没进行索引库保存,因此在搜索时程序会报错
Directory dir=new RAMDirectory();
File file
= new File(dspath);
//Document存放经过组织后的数据源,只有转换为Document对象才可以被索引和搜索到
Document doc = new Document();
//文件名称
doc.add(new Field("name", file.getName(), Store.YES, Index.ANALYZED));
//检索到的内容
doc.add(new Field("content", readFileContent(file), Store.YES, Index.ANALYZED));
//文件大小
doc.add(new Field("size", NumberTools.longToString(file.length()),
Store.YES, Index.NOT_ANALYZED));
//检索到的文件位置
doc.add(new Field("path", file.getAbsolutePath(), Store.YES, Index.NOT_ANALYZED));

// 建立索引
//第一种方式
//IndexWriter indexWriter = new IndexWriter(indexpath, analyzer, MaxFieldLength.LIMITED);
//第二种方式
IndexWriter indexWriter = new IndexWriter(dir, analyzer, MaxFieldLength.LIMITED);
indexWriter.addDocument(doc);
indexWriter.close();
}

/**
* 创建索引,不会抛异常
*
* IndexWriter 用来操作(增、删、改)索引库的
*/
@Test
public void createIndex2() throws Exception {
//数据源
File file = new File(dspath);

Directory fsDir
= FSDirectory.getDirectory(indexpath);
// 1,启动时读取
Directory ramDir = new RAMDirectory(fsDir);

// 运行程序时操作ramDir
IndexWriter ramIndexWriter = new IndexWriter(ramDir, analyzer, MaxFieldLength.LIMITED);
// 添加 Document
Document doc = new Document();
//文件名称
doc.add(new Field("name", file.getName(), Store.YES, Index.ANALYZED));
//检索到的内容
doc.add(new Field("content", readFileContent(file), Store.YES, Index.ANALYZED));
//文件大小
doc.add(new Field("size", NumberTools.longToString(file.length()), Store.YES, Index.NOT_ANALYZED));
//检索到的文件位置
doc.add(new Field("path", file.getAbsolutePath(), Store.YES, Index.NOT_ANALYZED));
ramIndexWriter.addDocument(doc);
ramIndexWriter.close();

// 2,退出时保存
IndexWriter fsIndexWriter = new IndexWriter(fsDir, analyzer, true, MaxFieldLength.LIMITED);
fsIndexWriter.addIndexesNoOptimize(
new Directory[]{ramDir});
// 优化
// fsIndexWriter.flush();
// fsIndexWriter.optimize();
fsIndexWriter.close();
}

/**
* 优化操作
*
*
@throws Exception
*/
@Test
public void createIndex3() throws Exception{
Directory fsDir
= FSDirectory.getDirectory(indexpath);
IndexWriter fsIndexWriter
= new IndexWriter(fsDir, analyzer, MaxFieldLength.LIMITED);

fsIndexWriter.optimize();
fsIndexWriter.close();
}

/**
* 搜索
*
* IndexSearcher 用来在索引库中进行查询
*/
@Test
public void search() throws Exception {
//请求字段
//String queryString = "document";
String queryString = "adddocument";

// 1,把要搜索的文本解析为 Query
String[] fields = { "name", "content" };
QueryParser queryParser
= new MultiFieldQueryParser(fields, analyzer);
Query query
= queryParser.parse(queryString);

// 2,进行查询,从索引库中查找
IndexSearcher indexSearcher = new IndexSearcher(indexpath);
Filter filter
= null;
TopDocs topDocs
= indexSearcher.search(query, filter, 10000);
System.out.println(
"总共有【" + topDocs.totalHits + "】条匹配结果");

// 3,打印结果
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
// 文档内部编号
int index = scoreDoc.doc;
// 根据编号取出相应的文档
Document doc = indexSearcher.doc(index);
System.out.println(
"------------------------------");
System.out.println(
"name = " + doc.get("name"));
System.out.println(
"content = " + doc.get("content"));
System.out.println(
"size = " + NumberTools.stringToLong(doc.get("size")));
System.out.println(
"path = " + doc.get("path"));
}
}

/**
* 读取文件内容
*/
public static String readFileContent(File file) {
try {
BufferedReader reader
= new BufferedReader(new InputStreamReader(new FileInputStream(file)));
StringBuffer content
= new StringBuffer();
for (String line = null; (line = reader.readLine()) != null;) {
content.append(line).append(
"\n");
}
reader.close();
return content.toString();
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
}

分享到:
评论

相关推荐

    Lucene.Net基本用法

    - **目录管理**:通过`Directory`接口实现,本文示例使用了`RAMDirectory`,即将索引存储于内存中,适用于测试环境。实际生产环境中,通常使用`FSDirectory`,将索引存储于磁盘上。例如: ```csharp private ...

    lucene 3.0 API 中文帮助文档

    在3.0版本中,有FSDirectory(文件系统目录)和RAMDirectory(内存目录)等实现。 9. **Field**: Field是Document的组成部分,它具有特定的名称和内容,可以设置是否存储、是否可搜索、是否可索引等属性。 了解了...

    lucene,lucene教程,lucene讲解

    第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。 第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。 public void add(Query query, BooleanClause.Occur occur) BooleanClause...

    lucene.net+完全入门教程

    7. **内存与磁盘管理**: Lucene.Net利用RAMDirectory和FSDirectory类分别处理内存和磁盘上的索引存储。这允许在内存中快速访问,同时将大部分数据保存在硬盘上,以节省内存。 8. **多线程支持**: Lucene.Net支持多...

    lucene.net

    6. **存储(Store)**:Lucene.NET使用RAMDirectory或FSDirectory来存储索引,前者在内存中,适合小规模数据,后者在硬盘上,适合大规模数据。 实际应用中,Lucene.NET常用于网站搜索、日志分析、知识图谱等场景。...

    lucene-4.0.0-src.zip 【Lucene 4.0.0源码包src , source】

    5. **内存与磁盘存储(Memory & Disk Storage)**:Lucene利用`RAMDirectory`和`FSDirectory`等类管理索引在内存和磁盘上的存储,以平衡性能和资源消耗。 为了在Eclipse中查看和理解这些源码,我们需要进行以下步骤...

    lucene包,lucene实现核心代码

    - `Directory`:存储索引的接口,如FSDirectory用于文件系统,RAMDirectory用于内存中。 - `IndexReader`:读取索引的接口,用于获取文档数量、文档信息等。 - `IndexSearcher`:执行搜索操作的核心类,可以接受...

    lucene 2.0 api以及lucene 3.0 api

    5. **内存索引与磁盘索引**: `RAMDirectory` 用于内存中的索引,而 `FSDirectory` 则用于磁盘上的索引,两者可以根据需求灵活选择。 **Lucene 3.0 API 更新与改进** 1. **SegmentMerger 改进**: Lucene 3.0 中,`...

    Lucene 索引的简单使用

    1. **初始化Directory**:选择存储索引的目录,如FSDirectory(文件系统)、RAMDirectory(内存)等。 2. **创建IndexWriter**:配置IndexWriter实例,指定Directory、Analyzer和其他参数。 3. **创建文档**:定义...

    lucene2.9开发指南

    开发者需要在Java项目的classpath中添加`lucene-core-2.9.1.jar`,这是使用Lucene的基础。确保这个库被正确引入后,就可以开始构建基于Lucene的搜索应用。 2. **全文搜索工作流程**: - **建立索引**:这是Lucene...

    Lucene.2.0.API

    《Lucene.2.0.API》是关于开源全文搜索引擎库Lucene的一个重要参考资料,它详尽地记录了Lucene 2.0版本的API接口及其使用方法。Lucene是一个由Apache软件基金会开发的Java全文检索库,它提供了高性能、可扩展的文本...

    spring-lucene简单项目

    Directory则用来保存索引,可以选择不同的实现,如内存中的RAMDirectory或磁盘上的FSDirectory。IndexWriter是构建和管理索引的关键对象。 接下来,你需要创建一个索引器类,该类使用Spring的ApplicationContext...

    lucene入门小例子

    创建Directory,作为索引的存储位置,如内存目录RAMDirectory或磁盘上的FSDirectory。 2. 创建索引:创建IndexWriter对象,设置Analyzer和Directory,然后逐个添加Document。每个Document代表一个要索引的实体,...

    lucene5.3.1增删改查

    2. **创建Directory**: Directory是Lucene中存储索引的地方,它可以是内存中的RAMDirectory,也可以是磁盘上的FSDirectory。 3. **创建IndexWriter**: IndexWriter用于写入索引,它会处理文档添加、删除和更新。...

    lucene中文资料

    3. **目录与存储**:Lucene 使用 Directory 类来管理索引的物理存储,常见的 Directory 实现包括 FSDirectory(文件系统目录)和 RAMDirectory(内存目录)。 **二、索引操作** 1. **创建索引**:使用 IndexWriter...

    lucene的实际应用案例

    Lucene提供了一个`Directory`接口,你可以选择如`FSDirectory`(文件系统目录)或`RAMDirectory`(内存目录)来存储索引。然后,创建一个`IndexWriter`实例,配置好分词器(Tokenizer)、过滤器(Filter)以及分析器...

    lucene 索引小示例

    3. **创建Directory**: Directory代表了存储索引的物理位置,如内存(RAMDirectory)或磁盘(FSDirectory)。 4. **创建IndexWriter**: IndexWriter是负责写入和更新索引的对象。设置好Analyzer和Directory后,就...

    lucene实现全文搜索

    3. **Directory**:存储索引的地方,Lucene提供两种类型的Directory,FSDirectory用于磁盘存储,RAMDirectory用于内存存储,前者是更常见的选择,但在某些情况下,内存索引可以提高性能。 4. **Analyzer**:负责对...

    lucene.net源代码

    1. 初始化Directory对象,这通常是内存中的RAMDirectory或硬盘上的FSDirectory。 2. 创建Analyzer实例,根据需求选择不同的Analyzer。 3. 创建IndexWriter,设置相应的参数,如写入模式、最大文档数等。 4. 创建...

Global site tag (gtag.js) - Google Analytics