`
BuN_Ny
  • 浏览: 83268 次
  • 来自: 济南
社区版块
存档分类
最新评论

16) 第二章 索引:设置Field的截断

阅读更多

    针对Field我们还有最后一个特性要讨论:截断(truncation)。其实就是之前"基本索引操作"中提到的 MaxFieldLength 问题。如果只是从字面上感觉,它就是个设置Field最大长度的值。

    那么它到底是设置一个文档中同名域的最大个数还是不同文档的同名域的最大个数?是设置同名域的最大Term数还是一个域的最大Term数?

 

    答案是:一个域的最大Term数。也就是说,我们第十节(Field中含多个值的问题)中所讲的方式索引的同名Field,属于不同的Field实例,并非整个名为"author"的域的最大长度受限,而是其中的每个Field实例的最大长度受限。算了,我表达的一塌糊涂...

 

    直接上代码:

 

public class IndexTruncationTest extends TestCase{
	
	private Directory directory;
	
	public void setUp() throws Exception{
		directory = new RAMDirectory();
		IndexWriter writer = new IndexWriter(directory, new WhitespaceAnalyzer(),
				new MaxFieldLength(50));

		writer.setInfoStream(System.out);
		
		//只有一个Field实例
		Document doc = new Document();
		String term = "";
		for(int i=0; i<100; ++i){
			term += " Test"+i;
		}
		doc.add(new Field("test",
				term,
				Field.Store.YES,
				Field.Index.ANALYZED));
		writer.addDocument(doc);
		
        writer.close();
	}
	
	//前50个Term是可以搜索到的
	public void testUnTruncated() throws Exception{
		IndexSearcher is = new IndexSearcher(directory);
        Query query = new TermQuery(new Term("test","Test0"));
        Query query2 = new TermQuery(new Term("test","Test2"));
        Query query49 = new TermQuery(new Term("test","Test49"));
        
        int i0 = TestUtil.hitCount(is, query);
        int i2 = TestUtil.hitCount(is, query2);
        int i49 = TestUtil.hitCount(is, query49);
        
        assertEquals(1, i0);
        assertEquals(1, i2);
        assertEquals(1, i49);

        is.close();
	}
	
	//后50个Term被无情的忽略了...
	public void testTruncated() throws Exception{
		IndexSearcher is = new IndexSearcher(directory);
        Query query50 = new TermQuery(new Term("test","Test50"));
        Query query52 = new TermQuery(new Term("test","Test52"));
        Query query99 = new TermQuery(new Term("test","Test99"));
        
        int i0 = TestUtil.hitCount(is, query50);
        int i2 = TestUtil.hitCount(is, query52);
        int i49 = TestUtil.hitCount(is, query99);
        
        assertEquals(0, i0);
        assertEquals(0, i2);
        assertEquals(0, i49);

        is.close();
	}

}

 

    其中,writer.setInfoStream(PrintStream infoStream); 方法可以用来查看包括maxFieldLength在内的一些信息。我把标准输出流作为参数传给了它,于是在我的控制台上输出了如下信息:

 

IFD [Tue Jun 14 16:45:11 CST 2011; main]: setInfoStream deletionPolicy=org.apache.lucene.index.KeepOnlyLastCommitDeletionPolicy@10e3293

IW 0 [Tue Jun 14 16:45:11 CST 2011; main]: setInfoStream: dir=org.apache.lucene.store.RAMDirectory@4a63d8 lockFactory=org.apache.lucene.store.SingleInstanceLockFactory@1e0ff2f mergePolicy=org.apache.lucene.index.LogByteSizeMergePolicy@1d6776d mergeScheduler=org.apache.lucene.index.ConcurrentMergeScheduler@13ad085 ramBufferSizeMB=16.0 maxBufferedDocs=-1 maxBuffereDeleteTerms=-1 maxFieldLength=50 index=

maxFieldLength 50 reached for field test, ignoring following tokens

IW 0 [Tue Jun 14 16:45:11 CST 2011; main]: now flush at close

IW 0 [Tue Jun 14 16:45:11 CST 2011; main]: flush: now pause all indexing threads

IW 0 [Tue Jun 14 16:45:11 CST 2011; main]:   flush: segment=_0 docStoreSegment=_0 docStoreOffset=0 flushDocs=true flushDeletes=true flushDocStores=true numDocs=1 numBufDelTerms=0

IW 0 [Tue Jun 14 16:45:11 CST 2011; main]:   index before flush 

IW 0 [Tue Jun 14 16:45:11 CST 2011; main]: DW: flush postings as segment _0 numDocs=1

IW 0 [Tue Jun 14 16:45:11 CST 2011; main]: DW: closeDocStore: 2 files to flush to segment _0 numDocs=1

IW 0 [Tue Jun 14 16:45:11 CST 2011; main]: DW:   oldRAMSize=111616 newFlushedSize=1241 docs/MB=844.944 new/old=1.112%

IW 0 [Tue Jun 14 16:45:11 CST 2011; main]: flushedFiles=[_0.fdt, _0.frq, _0.nrm, _0.fdx, _0.tii, _0.tis, _0.fnm, _0.prx]

IFD [Tue Jun 14 16:45:11 CST 2011; main]: now checkpoint "segments_1" [1 segments ; isCommit = false]

IFD [Tue Jun 14 16:45:11 CST 2011; main]: now checkpoint "segments_1" [1 segments ; isCommit = false]

IFD [Tue Jun 14 16:45:11 CST 2011; main]: delete "_0.fdt"

IFD [Tue Jun 14 16:45:11 CST 2011; main]: delete "_0.frq"

IFD [Tue Jun 14 16:45:11 CST 2011; main]: delete "_0.nrm"

IFD [Tue Jun 14 16:45:11 CST 2011; main]: delete "_0.fdx"

IFD [Tue Jun 14 16:45:11 CST 2011; main]: delete "_0.tii"

IFD [Tue Jun 14 16:45:11 CST 2011; main]: delete "_0.tis"

IFD [Tue Jun 14 16:45:11 CST 2011; main]: delete "_0.prx"

...

 

    当然,除了直接在IndexWriter的构造器中指定maxFieldLength,还可以通过 writer.setMaxFieldLength(xxx); 方法来设定该值,对应的还有个 writer.getMaxFieldLength(xxx); 方法。

    另外,Lucene内置了两个限制值,一个是 0x7fffffff,一个是 10000,它们分别是MaxFieldLength.UNLIMITED(无限制,但事实是限制在最大整数范围内)和MaxFieldLength.LIMITED(其值设定为10000).

 

 

 

 

 

2
1
分享到:
评论

相关推荐

    oracle11g

    第十一章:索引 第十二章:约束 第十三章:视图 第十四章:同义词 第十五章:序列 第三部分:SQL语言的扩展 第十六章:INSERT语句总结 第十七章:DML和DDL语句的其他用法 第十八章 通过GROUP BY产生统计...

    ORACLE+DBA必备技能详解.pdf

    第六章:索引 第七章:视图 第八章:集群 第十章:用户,资源文件,角色喝授权 第十一章:其他管理特性 第十二章:优化器 第十三张:其他命令 第十四章:内置函数 第十五章:DML命令 附录A:初始化参数 附录B:数据...

    MySQL 索引:索引为什么使用 B+树? · .pdf

    MySQL 索引:索引为什么使用 B+树? · .pdf

    34丨MySQL调优之索引:索引的失效与优化.html

    34丨MySQL调优之索引:索引的失效与优化.html

    MySQL索引:优化查询的利器.md

    MySQL索引:优化查询的利器

    关于MySQL面试题中有关索引的九大难点全在这里了

    o非聚集索引:非聚集索引就是以非主键创建的索引,在叶子节点存储的是主键和索引列。 逻辑维度 o主键索引:一种特殊的唯一索引,不允许有空值。 o普通索引:MySQL中基本索引类型,允许空值和重复值。 o联合索引:多...

    oracle管理应用工具和sql高级应用视频教程详细完整版

    第四章:使用索引 第五章:约束的作用 第六章:视图、同义词和序列 第七章:Insert语句语法 第八章:DML和DDL语句 第九章:Select的高级应用 第十章:Oracle的国际化支持。 由于文件过大,只提供百度网盘下载地址和...

    论文研究-相似索引:适用于重复数据删除的二级索引.pdf

    它把相似哈希作为文件的特征, 是一种适用于以小文件为主的数据负载的重复数据删除的二级索引。实验结果表明, 相似索引的重复数据删除率比EB高24. 8%; 相似索引的内存使用量仅仅是EB的0. 265%。与EB相比, 相似索引...

    深入解析MongoDB聚合与索引:提升数据库效能的关键策略

    深入解析MongoDB聚合与索引:提升数据库效能的关键策略

    MySQL索引不会被用到的情况汇总

    MySQL中索引的类型 一般可分为四类: 普通索引:最普通的索引 唯一索引:索引列的值必须唯一,但允许有空值 主键索引:一种特殊的唯一索引,不允许有空值 联合索引:索引列有多个字段,使用时需要满足最左前缀...

    内存数据索引:以处理器为核心的性能优化技术.pdf

    内存数据索引:以处理器为核心的性能优化技术.pdf

    论文研究-GP索引:一种基于HBase的多维索引 .pdf

    GP索引:一种基于HBase的多维索引,陈汉,胡铮,随着互联网数据量爆发式的增长,分布式数据库HBase发挥了举足轻重的作用。但是在面对众多的移动互联网服务,例如基于位置的服务(L

    Hive编程指南中文版

    Hive编程指南中文版 2013年12月 第1版 ...第16章 Hive的Thrift服务 第17章 存储处理程序和NoSQL 第18章 安全 第19章 锁 第20章 Hive和Oozie整合 第21章 Hive和亚马逊网络服务系统 第22章 HCatalog 第23章 案例研究

    BP2015英国药典索引[收集].pdf

    BP2015英国药典索引 BP2015英国药典索引是英国药典委员会发布的一本药典索引,收录了大量的药物信息,涵盖了从药物名称到制备方法、理化性质、药理作用、毒理作用等多方面的内容。下面是从该索引中提取的知识点: ...

    mplus 8 用户手册 Chapter16 分析命令.pdf

    以下是版本 8 Mplus 用户指南的摘录。第 3 章 - 第 13 章包括 250 多个示例。...第16章:分析命令 第17章:MODEL命令 第 18 章:输出、保存数据和绘图命令 第19章:蒙特卡洛命令 第20章:Mplus语言摘要 引用/索引

    ORACLE教材

    第二章:sql基础 ORACLE数据类型 SQL基本语法 简单查询 SQL函数 多数据表查询 事务控制 第三章:plsql基础 声明及变量 表达式 PL/SQL数据类型 流程控制 异常处理 过程 函数 游标 包 触发器 第...

    mplus 8 用户手册 Chapter13 示例:特殊功能.pdf

    以下是版本 8 Mplus 用户指南的摘录。第 3 章 - 第 13 章包括 250 多个示例。...第16章:分析命令 第17章:MODEL命令 第 18 章:输出、保存数据和绘图命令 第19章:蒙特卡洛命令 第20章:Mplus语言摘要 引用/索引

    mysql创建索引:mysql

    创建索引.txt

    mplus 8 用户手册 Chapter18 输出、保存数据和绘图命令.pdf

    以下是版本 8 Mplus 用户指南的摘录。第 3 章 - 第 13 章包括 250 多个示例。...第16章:分析命令 第17章:MODEL命令 第 18 章:输出、保存数据和绘图命令 第19章:蒙特卡洛命令 第20章:Mplus语言摘要 引用/索引

    mplus 8 用户手册 Chapter4 探索性因素分析视图示例.pdf

    以下是版本 8 Mplus 用户指南的摘录。第 3 章 - 第 13 章包括 250 多个示例。...第16章:分析命令 第17章:MODEL命令 第 18 章:输出、保存数据和绘图命令 第19章:蒙特卡洛命令 第20章:Mplus语言摘要 引用/索引

Global site tag (gtag.js) - Google Analytics