`
liliang1222
  • 浏览: 158712 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

lucene学习(2)

阅读更多
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学习pdf2" 提供的文档,无疑是对Lucene深入理解的一把钥匙,它涵盖了Lucene的核心概念、操作流程以及高级特性。 首先,Lucene的基础知识是必不可少的。Lucene的核心在于索引和搜索,它将非结构化的文本数据...

    lucene学习资料收集

    【标题】:“Lucene学习资料收集” 【描述】:Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。这个资料集可能包含了关于如何理解和使用Lucene的各种资源,特别是通过博主huanglz19871030在iteye上的...

    Lucene的的学习资料及案例

    **Lucene学习指南** Lucene是一个高性能、全文检索库,由Apache软件基金会开发并维护,是Java编程语言中广泛使用的搜索引擎库。它提供了一个简单的API,使得开发者能够方便地在应用中实现全文检索功能。本篇文章将...

    lucene学习

    2、Lucene实现全文检索的流程 a) 创建索引 b) 查询索引 3、配置开发环境 4、创建索引库 5、查询索引库 6、分析器的分析过程 a) 测试分析器的分词效果 b) 第三方中文分析器 7、索引库的维护 a) 添加文档 b) 删除文档 ...

    Lucene学习源码.rar

    本文将主要围绕Java Lucene进行深入探讨,并基于提供的“Lucene学习源码.rar”文件中的“Lucene视频教程_讲解部分源码”展开讨论。 一、Lucene核心概念 1. 文档(Document):Lucene中的基本单位,用于存储待检索...

    lucene学习资料

    《Lucene学习资料》 Lucene是一个开源的全文搜索引擎库,由Apache软件基金会维护。它提供了高级的文本分析和索引功能,使得开发者能够轻松地在应用程序中集成强大的搜索功能。这个资料包中的《Lucene in Action_2nd...

    Lucene-2.0学习文档

    本篇文章将围绕"Lucene-2.0学习文档"的主题,结合Indexer.java、MyScoreDocComparator.java和MySortComparatorSource.java这三个关键文件,深入探讨Lucene的核心概念和实际应用。 首先,我们来看`Indexer.java`。这...

    Lucene3.3.0学习Demo

    **Lucene 3.3.0 学习Demo** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。在3.3.0版本中,Lucene提供了强大的文本搜索功能,包括分词、索引创建、查询解析和结果排序等。这个"Lucene3.3.0学习Demo...

    lucene学习-02

    【标题】:“Lucene学习-02” 在深入探讨“Lucene学习-02”这一主题之前,我们先来理解一下Lucene的核心概念。Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,广泛应用于各种搜索引擎和信息检索系统。...

    Lucene.net学习帮助文档

    **Lucene.net学习帮助文档** Lucene.net是一个开源全文搜索引擎库,它是Apache Lucene项目的一部分,专门针对.NET Framework进行了优化。这个压缩包包含了Lucene.net的源码和中文学习文档,旨在帮助开发者深入理解...

    【大搜集:lucene学习资料】---<下载不扣分,回帖加1分,欢迎下载,童叟无欺>

    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 3.6 学习笔记】 Lucene 是一个高性能、全文本搜索库,广泛应用于各种搜索引擎的开发。本文将深入探讨Lucene 3.6版本中的关键概念、功能以及实现方法。 ### 第一章 Lucene 基础 #### 1.1 索引部分的核心...

    lucene4.8学习资料和案例

    2. 代码示例:通过分析提供的"lucene4.8学习资料和案例"压缩包,可以深入了解Lucene的实践操作,如创建索引、执行查询、处理结果等。 3. 在线教程:网络上有许多优秀的Lucene教程,如《Lucene in Action》一书的在线...

    Lucene学习工具包.zip

    **Lucene学习工具包** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。这个"Lucene学习工具包.zip"包含了学习Lucene所需的重要资料和资源,旨在帮助开发者深入理解和掌握Lucene的核心概念、功能...

    搜索引擎lucene学习资料

    通过这些学习资料,读者可以系统地学习搜索引擎的理论基础,掌握Lucene的核心功能,同时也能了解到如何在实际项目中应用这些技术,提升搜索系统的性能和用户体验。这些知识对于从事信息检索、网站开发、大数据分析等...

    lucene学习总结

    **Lucene学习总结** 在深入理解Lucene之前,我们首先需要了解什么是全文检索。全文检索是一种从大量文本数据中快速查找所需信息的技术。它通过建立索引来实现高效的搜索,而Lucene正是Java环境下最著名的全文搜索...

Global site tag (gtag.js) - Google Analytics