public abstract class BaseIndexingTestCase {
protected String[] keywords = {"1", "2"};
protected String[] unindexed = {"Netherlands", "Itely"};
protected String[] unstored = {"Amsterdam has lots of bridges", "Venice has lots of canals"};
protected String[] text = {"Amsterdam", "Venice"};
protected Directory dir;
public void init() throws IOException {
String indexDir = "D:/test";
dir = FSDirectory.open(new File(indexDir));
}
public BaseIndexingTestCase() {
try {
init();
} catch (IOException e) {
e.printStackTrace();
}
}
//===================创建文档=====================
protected void setUp() throws IOException {
addDocuments(dir);
}
protected void addDocuments(Directory dir2) throws CorruptIndexException, LockObtainFailedException, IOException {
IndexWriter writer = getIndexWriter(dir2);
for (int i = 0; i < keywords.length; i++) {
Document doc = new Document();
doc.add(new Field("id",keywords[i], Store.YES, Index.ANALYZED));
doc.add(new Field("city",text[i], Store.NO, Index.ANALYZED));
doc.add(new Field("contents",unstored[i], Store.YES, Index.ANALYZED));
doc.add(new Field("unindexed",keywords[i], Store.YES, Index.NO));
writer.addDocument(doc);
}
writer.close();
}
//===============================搜索=======================
protected void search(String field, String value) throws CorruptIndexException, IOException, ParseException {
IndexSearcher search = getIndexSearcher();
QueryParser parser = new QueryParser(Version.LUCENE_36, field, getAnalyzer());
Query query = parser.parse(value);
TopDocs topDocs = search.search(query, 10);
ScoreDoc[] docs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : docs) {
int docID = scoreDoc.doc;
Document document = search.doc(docID);
List<Fieldable> list = document.getFields();
for (Fieldable fieldable : list) {
System.out.println(fieldable.name() + " : " + fieldable.stringValue());
}
}
search.close();
}
//=============================删除文档=========================
protected void delete(Term term) throws CorruptIndexException, IOException {
IndexWriter writer = getIndexWriter(dir);
writer.deleteDocuments(term);
//老版本中,通过IndexReader删除,且在IndexReader关闭时提交
writer.forceMergeDeletes();
writer.close();
}
protected void delete(Query query) throws CorruptIndexException, IOException {
IndexWriter writer = getIndexWriter(dir);
writer.deleteDocuments(query);
writer.forceMergeDeletes();
writer.close();
}
protected void delete(String name, String value) throws CorruptIndexException, IOException, ParseException {
Query query = getQuery(name, value);
IndexWriter writer = getIndexWriter(dir);
writer.deleteDocuments(query);
writer.forceMergeDeletes();
writer.close();
}
protected void deleteAll() throws ParseException, CorruptIndexException, IOException {
Query query = getQuery("*","*");
delete(query);
}
//=======================更新索引=====================
protected void update(String field, String value, Document doc) throws CorruptIndexException, LockObtainFailedException, IOException {
IndexWriter writer = getIndexWriter(dir);
Term term = new Term(field, value);
//先删除原来的索引,后添加新的索引
writer.updateDocument(term, doc);
}
//======================恢复删除================================
protected void undelete() throws CorruptIndexException, IOException {
//老版本通过IndexReader的undeleteAll恢复(在执行物理删除前才行)
}
//========================命中数===================
protected int getHitCount(String field, String value) throws IOException, ParseException {
IndexSearcher search = getIndexSearcher();
Query query = getQuery(field, value);
TopDocs topDocs = search.search(query,10);
return topDocs.totalHits;
}
//========================索引中总文档数(包括删除未提交的文档)======================
protected int maxDocs() throws CorruptIndexException, LockObtainFailedException, IOException {
IndexWriter writer = getIndexWriter(dir);
IndexReader reader = getIndexSearcher().getIndexReader();
System.out.println(writer.maxDoc() + "-" + reader.maxDoc());
writer.close();
reader.close();
return 0;
}
//=======================索引中可用的文档数(不包括删除未提交的文档)=====================
protected int numDocs() throws CorruptIndexException, LockObtainFailedException, IOException {
IndexWriter writer = getIndexWriter(dir);
IndexReader reader = getIndexSearcher().getIndexReader();
System.out.println(writer.numDocs() + "-" + reader.numDocs());
writer.close();
reader.close();
return 0;
}
//=================================================================
private Query getQuery(String name, String value) throws ParseException {
QueryParser parser = new QueryParser(Version.LUCENE_36, name, getAnalyzer());
Query query = parser.parse(value);
return query;
}
private IndexSearcher getIndexSearcher() throws CorruptIndexException, IOException {
IndexReader reader = IndexReader.open(dir);
IndexSearcher search = new IndexSearcher(reader);
return search;
}
private IndexWriter getIndexWriter(Directory dir2) throws CorruptIndexException, LockObtainFailedException, IOException {
IndexWriter writer = new IndexWriter(dir2, getIndexWriterConfig());
return writer;
}
private IndexWriterConfig getIndexWriterConfig() {
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36, getAnalyzer());
LogMergePolicy policy = new LogDocMergePolicy();
policy.setUseCompoundFile(true);
config.setMergePolicy(policy);
return config;
}
private Analyzer getAnalyzer() {
return new SimpleAnalyzer(Version.LUCENE_36);
}
}
分享到:
相关推荐
4. 更新与优化:Lucene允许动态更新索引,即添加、删除或修改文档。此外,定期的索引优化(Merge)可以合并多个段,提高搜索效率。 三、lucene-1.4.3.jar.license.txt 这个文件通常包含了关于Apache Lucene早期...
通过这些API,开发者可以方便地进行文档添加、删除、修改以及执行复杂的查询操作。 在实际应用中,开发人员通常会结合其他Lucene模块,如QueryParser、Analyzer等,来构建完整的搜索解决方案。例如,使用`...
6. **更新和删除**:`IndexWriter`不仅用于创建新索引,还可以用于对现有索引进行更新(添加、修改文档)和删除操作。 7. **高级功能**:Lucene还包括多线程支持、近实时搜索、自定义排序、过滤器(`Filter`)和...
以上就是关于“Lucene索引的简单使用”的详细介绍,包括其核心概念、创建和查询索引的步骤以及一些高级特性。希望对你理解和应用Lucene有所帮助。在实际开发中,可以根据需求选择合适的Analyzer,优化索引策略,以...
段合并是Lucene索引维护的重要部分,涉及`MergePolicy`和`MergeScheduler`两个关键组件。 9. **文档字段与存储** `Document`类是Lucene的基本数据结构,包含多个`Field`。`Field`有三种类型:存储(Stored)、索引...
3. **IndexWriter**:用于创建和更新索引,如添加、删除和修改文档。 4. **IndexReader**:用于读取已建立的索引,获取文档信息,支持批量操作。 5. **Searcher**:执行搜索任务,如`IndexSearcher`,可以基于给定...
2. **IndexWriter**:负责创建和更新索引,它处理文档的添加、删除和修改。在Lucene 2.4.0中,IndexWriter采用了段(Segment)的概念,每次写操作都会生成新的段,然后通过合并操作优化索引。 三、查询与搜索 1. *...
Lucene 的核心功能之一是创建高效的索引。索引过程将文档内容转化为便于搜索的数据结构。在4.6.1版本中,Lucene 支持分词、分析和标准化,这使得搜索时能够进行模糊匹配和同义词查询。同时,它支持倒排索引,这是一...
它处理文档的添加、删除和修改,并确保索引的一致性。 5. **Searcher**:搜索器执行查询并返回匹配结果。它可以是IndexSearcher,用于在线搜索,也可以是MultiSearcher,用于同时在多个索引上执行查询。 二、...
下面是一个简单的Lucene5索引创建流程: 1. **创建Analyzer**: 首先,你需要选择或自定义一个Analyzer,以处理输入文本。例如,可以使用StandardAnalyzer来处理英文文本。 ```java Analyzer analyzer = new ...
同时,Lucene也支持增量索引更新,允许在不重建整个索引的情况下添加、删除或修改文档。 6. **高级特性**:如多字段搜索、高亮显示搜索结果、地理位置搜索、近实时搜索(NRT,Near Real Time)等,这些在4.7.0版本...
在这个实例中,我们将深入探讨如何使用Lucene.NET 2.9.2来实现索引的生成、修改、查询和删除。 **一、索引生成** 首先,我们需要创建一个索引,这是全文检索的基础。在Lucene.NET中,我们通常会定义一个文档类,...
- **处理新增数据**:对于新插入的数据,我们创建一个新的Lucene文档,并添加到索引writer中。确保每个文档都关联有唯一标识符,以便后续更新和删除操作。 - **处理更新数据**:如果数据被修改,我们需要找到索引中...
以上就是关于“lucene创建修改删除组合条件查询”的主要知识点。通过熟练掌握这些操作,开发者可以构建出强大的全文搜索系统,满足各种复杂的查询需求。在实际应用中,还需要注意性能优化,如合理使用索引,以及根据...
6. **索引写入器(IndexWriter)**:用于创建和更新索引,支持批量添加、删除和修改文档。 **二、集成到 MVC 或 WebForms 网站** 在 MVC 或 WebForms 应用中集成 Lucene.Net,通常涉及以下步骤: 1. **配置分析器...
本文将深入探讨Lucene 4.7.2的特性,包括创建、删除和修改索引,以及高级搜索功能如通用对象搜索、范围搜索、排序和高亮显示。 首先,让我们了解如何利用Lucene 4.7.2创建索引。创建索引是全文检索的基础,它涉及将...
- **IndexWriter**:用于创建和更新索引,它管理索引的生命周期,包括添加、删除和修改文档。 - **IndexReader**:用于读取索引,提供搜索操作。 - **IndexSearcher**:执行搜索查询,并返回匹配的Document结果。...
Lucene索引存储在文件系统中,因此需要创建一个目录来保存索引。可以使用`FSDirectory`类来实现: ```java File indexLocation = new File("index"); Directory directory = FSDirectory.open(indexLocation.toPath...
- **IndexWriter**:用于创建和更新索引,你可以通过它来添加、删除和修改Documents。 - **Searcher**:负责查询执行和结果返回,包括Query解析、评分和排序。 - **Query**:表示用户的搜索请求,可以是简单的...
在实际应用中,开发者可以集成ThesaurusAnalyzer到他们的Lucene索引流程中,替换默认的Analyzer,从而优化搜索性能和结果的相关性。此外,该程序也可以用作独立工具,用于预处理文本数据,如文本清洗、分析和统计。 ...