import java.io.IOException;
import junit.framework.TestCase;
import org.apache.lucene.analysis.WhitespaceAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
/**
* adding documents to an index
* @author liang
*
*/
public class IndexingTest extends TestCase {
protected String[] ids = {"1","2"};
protected String[] unindexed = {"Netherlands","Italy"};
protected String[] unstored = {"Amsterdam has lots of bridges",
"Venice has lots of canals"
};
protected String[] text = {"Amsterdam","Venice"};
private Directory directory;
protected void setUp() throws Exception{//a
directory = new RAMDirectory();
IndexWriter writer = getWriter();//b
for(int i=0;i<ids.length;i++){//c
Document doc = new Document();
doc.add(new Field("id",ids[i],Field.Store.YES,Field.Index.NOT_ANALYZED));
doc.add(new Field("country",unindexed[i],Field.Store.YES,
Field.Index.NO));
doc.add(new Field("contents",unstored[i],Field.Store.NO,
Field.Index.ANALYZED));
doc.add(new Field("city",text[i],Field.Store.YES,
Field.Index.ANALYZED));
writer.addDocument(doc);
}
writer.close();
}
private IndexWriter getWriter() throws IOException{//d
return new IndexWriter(directory,new WhitespaceAnalyzer(),IndexWriter.MaxFieldLength.UNLIMITED);
}
protected int getHitCount(String fieldName,String searchString) throws IOException{
IndexSearcher searcher = new IndexSearcher(directory);//e
Term t = new Term(fieldName,searchString);
Query query = new TermQuery(t);//f
// int hitCount = TestUtil.hitCount(searcher,query);//g
int hitCount = searcher.search(query, 1).totalHits;
searcher.close();
return hitCount;
}
public void testIndexWrtier() throws IOException{
IndexWriter writer = getWriter();
assertEquals(ids.length,writer.numDocs());//h
}
public void testIndexReader() throws IOException{
IndexReader reader = IndexReader.open(directory);
assertEquals(ids.length,reader.maxDoc());//i
assertEquals(ids.length,reader.numDocs());
reader.close();
}
public void testDeleteBeforeIndexMerge() throws IOException{
IndexWriter writer = getWriter();
assertEquals(2, writer.numDocs());//1
writer.deleteDocuments(new Term("id","1"));//2
writer.commit();
assertTrue(writer.hasDeletions());//index contains deletions
assertEquals(2, writer.maxDoc());
assertEquals(1, writer.numDocs());//1 indexed doucment,1 deleted document
writer.close();
}
public void testDeleteAfterIndexMerge() throws IOException{
IndexWriter writer = getWriter();
assertEquals(2, writer.numDocs());
writer.deleteDocuments(new Term("id","1"));
writer.optimize();
writer.commit();
assertFalse(writer.hasDeletions());
assertEquals(1, writer.maxDoc());//1 indexed document,0 deleted documents
assertEquals(1, writer.numDocs());
writer.close();
}
public void testFieldIndex() throws IOException{
//index no
IndexSearcher searcher = new IndexSearcher(directory);
Term term = new Term("country","Italy");
Query query = new TermQuery(term);
int hitCount = TestUtil.hitCount(searcher,query);//g
assertEquals(0, hitCount);
//index analyzer
term = new Term("contents","bridges");
query = new TermQuery(term);
hitCount = TestUtil.hitCount(searcher, query);
searcher.close();
assertEquals(1, hitCount);
}
public void testUpdate() throws IOException{
assertEquals(1, getHitCount("city", "Amsterdam"));
IndexWriter writer = getWriter();
Document doc = new Document();
doc.add(new Field("id","1",Field.Store.YES,Field.Index.NOT_ANALYZED));
doc.add(new Field("country","Netherlands",Field.Store.YES,
Field.Index.NO));
doc.add(new Field("contents","Amsterdam has lots of bridges",
Field.Store.NO,Field.Index.ANALYZED));
doc.add(new Field("city","Haag",Field.Store.YES,Field.Index.ANALYZED));
writer.updateDocument(new Term("id","1"), doc);
writer.close();
assertEquals(0, getHitCount("city", "Amsterdam"));
assertEquals(1, getHitCount("city", "Haag"));
}
}
将文档从index中删除
- deleteDocuments(Term) 删除所有包含term的document
- deleteDocuments(Query) 删除匹配query的document
- deleteDocuments(Query[]) 删除匹配任意其中一个query的document
如果要删除一个文档,必须保证每个文档都建立了索引而且对应field的值是唯一的那个field需要indexed而且
un-analyzed(索引而且不分词)
maxDoc() 返回所有的文档总数(删除的还有没删除的)
numDocs() 只返回没有删除的文档数
hasDeletions() 用来判断索引中是否有删除的文档
调用optimize()后,将移去已经删除的文档,
更新index中的文档
lucene不能只更新文档中只改变的部分,它删除旧的文档然后添加新的文档相当于先调用deleteDocument然后调用addDocument
- updateDocument(Term,Document) 首先删除所有包含该term的文档,然后添加一个新的文档,利用indexWriter的默认analyzer
- undateDocument(Term,Document,Analyzer) 同上,只不过是指明analyzer
Field options
- Field.Index
Field.Index.ANALYZED:
field的值会被analyzer进行处理。将field的值进行分词,每个分词都能被搜索到
常用于文本域(如body,title等)
Field.Index.NOT_ANALYZED:
field的值在index前不会被analyer处理。即整个field的值当作一个分词,用来搜索
常用于希望被搜索但是不希望被分词
Field.Index.ANALYZED_NO_NORMS:
Field.Index.NOT_ANALYZED_NO_NORMS:
Field.Index.NO:没有建立索引,即不能根据该field查找内容
- Field.Store
Field.Store.YES 存储该值
Field.Store.NO 不存储该值
- Field options for term vectors
一般用于亮色显示和查看相似文档
term vectors 是indexed field和stored field的混合体
term vectors 首先被document id指出,然后是term,就像对每个文档再来个倒排索引
TermVector.YES :记录遇到的唯一的terms,在每个文档中它们的数量,不记录位置和偏移信息TermVector.WITH_POSITIONS:记录唯一的terms和数量,还记录每个term的位置,不记录偏移
TermVector.WITH_OFFSETS:记录唯一的terms和数量,还记录移,不记录位置TermVector.WITH_POSTION_OFFSETS 都记录
TermVector.NO 不记录任何term vector information
只有索引该field才能索引term vector
Field(String name,Reader value,TermVector vector)
默认的选项值:Store.NO, Index.ANALYZED
Field(String name,TokenStream tokenStream,TermVector termVector)
默认的选项值:Store.NO ,Index.ANALYZED
Field(String name,byte[] value,Store store)
默认的选项值:Index.NO ,TermVector.NO,Store参数必须为Store.YES
分享到:
相关推荐
"lucene学习pdf2" 提供的文档,无疑是对Lucene深入理解的一把钥匙,它涵盖了Lucene的核心概念、操作流程以及高级特性。 首先,Lucene的基础知识是必不可少的。Lucene的核心在于索引和搜索,它将非结构化的文本数据...
【标题】:“Lucene学习资料收集” 【描述】:Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。这个资料集可能包含了关于如何理解和使用Lucene的各种资源,特别是通过博主huanglz19871030在iteye上的...
**Lucene学习指南** Lucene是一个高性能、全文检索库,由Apache软件基金会开发并维护,是Java编程语言中广泛使用的搜索引擎库。它提供了一个简单的API,使得开发者能够方便地在应用中实现全文检索功能。本篇文章将...
2、Lucene实现全文检索的流程 a) 创建索引 b) 查询索引 3、配置开发环境 4、创建索引库 5、查询索引库 6、分析器的分析过程 a) 测试分析器的分词效果 b) 第三方中文分析器 7、索引库的维护 a) 添加文档 b) 删除文档 ...
本文将主要围绕Java Lucene进行深入探讨,并基于提供的“Lucene学习源码.rar”文件中的“Lucene视频教程_讲解部分源码”展开讨论。 一、Lucene核心概念 1. 文档(Document):Lucene中的基本单位,用于存储待检索...
《Lucene学习资料》 Lucene是一个开源的全文搜索引擎库,由Apache软件基金会维护。它提供了高级的文本分析和索引功能,使得开发者能够轻松地在应用程序中集成强大的搜索功能。这个资料包中的《Lucene in Action_2nd...
本篇文章将围绕"Lucene-2.0学习文档"的主题,结合Indexer.java、MyScoreDocComparator.java和MySortComparatorSource.java这三个关键文件,深入探讨Lucene的核心概念和实际应用。 首先,我们来看`Indexer.java`。这...
**Lucene 3.3.0 学习Demo** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。在3.3.0版本中,Lucene提供了强大的文本搜索功能,包括分词、索引创建、查询解析和结果排序等。这个"Lucene3.3.0学习Demo...
【标题】:“Lucene学习-02” 在深入探讨“Lucene学习-02”这一主题之前,我们先来理解一下Lucene的核心概念。Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,广泛应用于各种搜索引擎和信息检索系统。...
**Lucene.net学习帮助文档** Lucene.net是一个开源全文搜索引擎库,它是Apache Lucene项目的一部分,专门针对.NET Framework进行了优化。这个压缩包包含了Lucene.net的源码和中文学习文档,旨在帮助开发者深入理解...
lucene学习笔记 2.txt lucene学习笔记 3 .txt lucene入门实战.txt Lucene 的学习 .txt Lucene-2.0学习文档 .txt Lucene入门与使用 .txt lucene性能.txt 大富翁全文索引和查询的例子程序.txt 关于lucene2.0...
【Lucene 3.6 学习笔记】 Lucene 是一个高性能、全文本搜索库,广泛应用于各种搜索引擎的开发。本文将深入探讨Lucene 3.6版本中的关键概念、功能以及实现方法。 ### 第一章 Lucene 基础 #### 1.1 索引部分的核心...
2. 代码示例:通过分析提供的"lucene4.8学习资料和案例"压缩包,可以深入了解Lucene的实践操作,如创建索引、执行查询、处理结果等。 3. 在线教程:网络上有许多优秀的Lucene教程,如《Lucene in Action》一书的在线...
**Lucene学习工具包** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。这个"Lucene学习工具包.zip"包含了学习Lucene所需的重要资料和资源,旨在帮助开发者深入理解和掌握Lucene的核心概念、功能...
通过这些学习资料,读者可以系统地学习搜索引擎的理论基础,掌握Lucene的核心功能,同时也能了解到如何在实际项目中应用这些技术,提升搜索系统的性能和用户体验。这些知识对于从事信息检索、网站开发、大数据分析等...
**Lucene学习总结** 在深入理解Lucene之前,我们首先需要了解什么是全文检索。全文检索是一种从大量文本数据中快速查找所需信息的技术。它通过建立索引来实现高效的搜索,而Lucene正是Java环境下最著名的全文搜索...