Lucene快速入门——索引的创建,检索,更新和删除

Posted 阿尔法猪猪的技术荟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lucene快速入门——索引的创建,检索,更新和删除相关的知识,希望对你有一定的参考价值。


导读

Lucene是apache软件基金会 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。本文是Lucene系列的开篇,从使用角度简单介绍了Lucene索引的创建,检索,更新和删除。


01

 创建索引 

创建索引的过程如下:

// 1. 设置索引文件目录Directory dir = FSDirectory.open(Paths.get(indexPath));
// 2. 构造IndexWriterAnalyzer analyzer = new StandardAnalyzer();IndexWriterConfig iwc = new IndexWriterConfig(analyzer);                 iwc.setOpenMode(OpenMode.CREATE);IndexWriter writer = new IndexWriter(dir, iwc);
// 3. 构造Document,一个Document可以包含多个FieldDocument doc = new Document(); doc.add(new StringField("path", file.toString(), Field.Store.YES));doc.add(new TextField("contents"new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8)), Field.Store.YES));
// 4. 写入Documentwriter.addDocument(doc);writer.close();


02

 检索索引 

检索索引的过程如下:

// 1. 构造IndexSearcherIndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(index)));IndexSearcher searcher = new IndexSearcher(reader);
// 2. 构造QueryAnalyzer analyzer = new StandardAnalyzer();QueryParser queryParser = new QueryParser("path", analyzer) ;queryParser.setDefaultOperator(QueryParser.OR_OPERATOR);Query query = queryParser.parse(line);
// 3. 通过IndexSearcher进行查找TopDocs results = searcher.search(query,10);ScoreDoc[] hits = results.scoreDocs;for (ScoreDoc hit:hits) {    Document doc = searcher.doc(hit.doc);    System.out.println(doc.get("path"));}


03

 更新索引 

更新索引的过程和插入索引非常接近,主要的区别有两点:

1. 第2步构造IndexWriter的时候,IndexWriterConfig的OpenMode需要设置为OpenMode.CREATE_OR_APPEND:

iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);
2. 第4步插入Document的时候,使用IndexWriter的updateDocument接口而不是addDocument接口:
writer.updateDocument(new Term("path", file.toString()), doc);


04

 删除索引 

Lucene索引可以根据Query对象来删除,可以根据Term来删除,也可以一次删除全部索引:

// 根据Query删除// 1. 构造Query,省略,可以参考第2段构造Query的代码Query query = xxx// 2. 删除writer.deleteDocuments(query);
// 根据Term删除writer.deleteDocuments(new Term("path", file.getPath()));
// 删除全部索引writer.deleteAll();

您可能还感兴趣: