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);
}
}
}
分享到:
相关推荐
- **目录管理**:通过`Directory`接口实现,本文示例使用了`RAMDirectory`,即将索引存储于内存中,适用于测试环境。实际生产环境中,通常使用`FSDirectory`,将索引存储于磁盘上。例如: ```csharp private ...
在3.0版本中,有FSDirectory(文件系统目录)和RAMDirectory(内存目录)等实现。 9. **Field**: Field是Document的组成部分,它具有特定的名称和内容,可以设置是否存储、是否可搜索、是否可索引等属性。 了解了...
第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。 第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。 public void add(Query query, BooleanClause.Occur occur) BooleanClause...
7. **内存与磁盘管理**: Lucene.Net利用RAMDirectory和FSDirectory类分别处理内存和磁盘上的索引存储。这允许在内存中快速访问,同时将大部分数据保存在硬盘上,以节省内存。 8. **多线程支持**: Lucene.Net支持多...
6. **存储(Store)**:Lucene.NET使用RAMDirectory或FSDirectory来存储索引,前者在内存中,适合小规模数据,后者在硬盘上,适合大规模数据。 实际应用中,Lucene.NET常用于网站搜索、日志分析、知识图谱等场景。...
5. **内存与磁盘存储(Memory & Disk Storage)**:Lucene利用`RAMDirectory`和`FSDirectory`等类管理索引在内存和磁盘上的存储,以平衡性能和资源消耗。 为了在Eclipse中查看和理解这些源码,我们需要进行以下步骤...
- `Directory`:存储索引的接口,如FSDirectory用于文件系统,RAMDirectory用于内存中。 - `IndexReader`:读取索引的接口,用于获取文档数量、文档信息等。 - `IndexSearcher`:执行搜索操作的核心类,可以接受...
5. **内存索引与磁盘索引**: `RAMDirectory` 用于内存中的索引,而 `FSDirectory` 则用于磁盘上的索引,两者可以根据需求灵活选择。 **Lucene 3.0 API 更新与改进** 1. **SegmentMerger 改进**: Lucene 3.0 中,`...
1. **初始化Directory**:选择存储索引的目录,如FSDirectory(文件系统)、RAMDirectory(内存)等。 2. **创建IndexWriter**:配置IndexWriter实例,指定Directory、Analyzer和其他参数。 3. **创建文档**:定义...
开发者需要在Java项目的classpath中添加`lucene-core-2.9.1.jar`,这是使用Lucene的基础。确保这个库被正确引入后,就可以开始构建基于Lucene的搜索应用。 2. **全文搜索工作流程**: - **建立索引**:这是Lucene...
《Lucene.2.0.API》是关于开源全文搜索引擎库Lucene的一个重要参考资料,它详尽地记录了Lucene 2.0版本的API接口及其使用方法。Lucene是一个由Apache软件基金会开发的Java全文检索库,它提供了高性能、可扩展的文本...
Directory则用来保存索引,可以选择不同的实现,如内存中的RAMDirectory或磁盘上的FSDirectory。IndexWriter是构建和管理索引的关键对象。 接下来,你需要创建一个索引器类,该类使用Spring的ApplicationContext...
创建Directory,作为索引的存储位置,如内存目录RAMDirectory或磁盘上的FSDirectory。 2. 创建索引:创建IndexWriter对象,设置Analyzer和Directory,然后逐个添加Document。每个Document代表一个要索引的实体,...
2. **创建Directory**: Directory是Lucene中存储索引的地方,它可以是内存中的RAMDirectory,也可以是磁盘上的FSDirectory。 3. **创建IndexWriter**: IndexWriter用于写入索引,它会处理文档添加、删除和更新。...
3. **目录与存储**:Lucene 使用 Directory 类来管理索引的物理存储,常见的 Directory 实现包括 FSDirectory(文件系统目录)和 RAMDirectory(内存目录)。 **二、索引操作** 1. **创建索引**:使用 IndexWriter...
Lucene提供了一个`Directory`接口,你可以选择如`FSDirectory`(文件系统目录)或`RAMDirectory`(内存目录)来存储索引。然后,创建一个`IndexWriter`实例,配置好分词器(Tokenizer)、过滤器(Filter)以及分析器...
3. **创建Directory**: Directory代表了存储索引的物理位置,如内存(RAMDirectory)或磁盘(FSDirectory)。 4. **创建IndexWriter**: IndexWriter是负责写入和更新索引的对象。设置好Analyzer和Directory后,就...
3. **Directory**:存储索引的地方,Lucene提供两种类型的Directory,FSDirectory用于磁盘存储,RAMDirectory用于内存存储,前者是更常见的选择,但在某些情况下,内存索引可以提高性能。 4. **Analyzer**:负责对...
1. 初始化Directory对象,这通常是内存中的RAMDirectory或硬盘上的FSDirectory。 2. 创建Analyzer实例,根据需求选择不同的Analyzer。 3. 创建IndexWriter,设置相应的参数,如写入模式、最大文档数等。 4. 创建...