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

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
分享到:
评论

相关推荐

    第三十六章:Mysql事务及索引1

    【数据库索引概述】 数据库索引是数据库管理系统中用于提高数据检索速度的一种数据结构。它类似于书籍的目录,提供了一种快速定位数据的方法。通过在数据表中创建索引,数据库系统可以避免全表扫描,直接找到所需的...

    mysql课件第四章索引、视图、触发器.ppt

    * 多列索引:针对多个字段,但是只有使用了索引的第一个字段,这个索引才能被使用。 * 空间索引:使用 spatial 参数建立,只针对空间数据类型。 创建索引的语法格式包括: * 在创建表时创建索引:Create table ...

    数据库应用技术:第08章_索引与视图.ppt

    数据库应用技术:第08章_索引与视图 本章主要讲述数据库应用技术中索引和视图的相关知识点。索引是与表或视图关联的磁盘上结构,索引中的键存储在一个结构中,使 SQL Server 可以快速有效地查找与键值关联的行。 ...

    oracle11g

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

    数据库原理及应用课件:第8章 索引.ppt

    数据库索引基础知识点总结 数据库索引是数据库管理系统中提高查询效率的重要技术手段。索引可以看作是一种快速查找数据的数据结构,它可以根据字段值快速定位数据。索引的作用类似于书籍中的目录,能够快速地定位...

    ORACLE+DBA必备技能详解.pdf

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

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

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

    SQL SERVER 2005练习集2续 第17章索引

    根据给定的文件信息,我们将深入探讨SQL Server 2005中索引的重要知识点,包括索引的创建、管理以及其对查询性能的影响。 ### 1. 索引的概念与分类 索引是数据库中用于提高数据检索速度的数据结构。在SQL Server ...

    Phoenix构建二级索引.rar

    《Phoenix构建二级索引——深度解析与实践指南》 在大数据处理领域,Phoenix以其高效、易用的特性,成为与Apache HBase结合的SQL查询引擎的首选。本指南将深入探讨如何在已有的Hbase环境中安装部署Phoenix,并利用...

    HBase二级索引

    2. 利用第三方组件:在HBase生态中,有如Apache Phoenix等组件提供了二级索引的功能。Apache Phoenix是建立在HBase之上的SQL接口,它使用HBase作为其底层存储引擎,同时提供了二级索引的管理功能。用户可以简单地...

    Hive编程指南中文版

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

    第9章 索引PPT学习资源

    以下是关于“第9章 索引”这一主题的详细知识点讲解: 1. **索引的概念**:索引是数据库管理系统中用于提高数据检索速度的数据结构。它们类似于书籍的目录,允许快速定位到所需数据,而无需遍历整个表。 2. **B-...

    MongoDB-索引

    二、唯一索引 1. 创建唯一索引:通过设置 "unique" 选项为 true 来创建唯一索引: ``` db.test.ensureIndex({"userid":1},{"unique":true}) ``` 2. 防止重复键:当尝试插入重复键时,MongoDB 会抛出 E11000 ...

    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_第3版_超清中文带目录版[PDF]

    第6章:优化服务器设置 265 第7章:操作系统和硬件优化 305 第8章:复制 343 第9章:伸缩性与高可用性 409 第10章:应用层面的优化 457 第11章:备份与还原 472 第12章:安全 521 第13章:MySQL服务器的状态 557 第...

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

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

Global site tag (gtag.js) - Google Analytics