文档章节

Lucene4 入门(2)–Field类及辅助类说明

一枚Sir
 一枚Sir
发布于 2014/04/10 15:15
字数 1458
阅读 905
收藏 1
点赞 0
评论 0

Lucene4 入门(2)–Field类及辅助类说明


一、Eclipse中Field类的继承关系图:

二、Field类

1、  类的说明

在一般情况下为Document对象创建一个Field对象会使用它的子类,比如:

IntField,LongField, FloatField, DoubleField, BinaryDocValuesField, StringField, TextField

, NumericDocValuesField, SortedDocValuesField, StoredField。而不是使用它自己。

一个Field是Document的一部分,每一个Field有三部分组成,分别是:名 称、类型和值。值可以是文本(String类型,Reader类型或者是预分享的TokenStream),二进制(byet[]),或者是数字(一个 Number类型)Field是可以存储在索引中的,以便日后返回这个文档。

需要注意的是:这个Field 是一个实现了IndexableFieldType接口的类,

修改IndexableFieldType的状态将影响字段的使用。强烈建议不要在实例化

Field对象后修改它。可以通过在创建Field的配置类FieldType时调用FieldType的

方法freeze().该方法的解释是:阻止未来改变,推荐在创建FieldType对象时调用,去预防无意的状态改变。

在Field子类中设置FieldType时都调用了freeze()方法,代码如下:

        TYPE_NOT_STORED.setIndexed(true);

        TYPE_NOT_STORED.setOmitNorms(true);

        TYPE_NOT_STORED.setIndexOptions(IndexOptions.DOCS_ONLY);

        TYPE_NOT_STORED.setTokenized(false);

        TYPE_NOT_STORED.freeze();

        上面是StringField中的一段代码,代码的最后调用了freeze()方法。

2、  构造函数

    • public Field(String name, Reader reader, FieldType type)

    • public Field(String name, TokenStream tokenStream,

    • FieldType type)

    • public Field(String name, byte[] value, FieldType type)

    • public Field(String name, byte[] value, int offset, int

    • length, FieldType type)

    • public Field(String name, BytesRef bytes, FieldType type)

    • public Field(String name, String value, FieldType type)

其中传byte[]参数的构造函数需要主要的是:byte[]参数使用不是复制(也就是使用的是对象引用),所以在Field完成前,不要修改它。

Field还有一些构造函数,在4.4版本中是不赞成使用的。

在上面所列的Field构造函数的最后一个参数都是FieldType类型,这个是Field重要的辅助类,稍后会记录。

3、  内部类

Field类里面还包含三个枚举类型的内部类,分别是:Store、Index和

TermVector,其中Index和TermVector在4.4版本中也是不赞成使用的,那我们就光看Store吧,它包含两个枚举值,YES和NO,就是表示Field是否存储时使用。

三、StringField类

1、  类的概述:

StringField是Field类的一个子类,其实就是在原有Field类的基础上 添加了FieldType字段,官方说明是:一个索引但不分词的Field,通过构造传过来的String值会是一个单独的Token,也就是会把这个字 符串当成一个完整的词来进行索引,官方还举了一些例子,如:一个地名或ID还有path(路径)都不需要分词。你打算使用排序或访问通过字段缓存。

2、  StringField类的源码

通过看这个类的源码你会一目了然

StringField定义了两个FieldType对象

一个为索引存储但不分词。另一个是索引不存储不分词,

这两个都是通过一个静态代码块儿来完成初始化的,通过看这个FieldType对象的设置,我们以后要定义FieldType时就可以参考这个了。

最后一个构造函数来调用父类的构造函数。

四、TextField类

1、  类的概述

跟StringField一样,TextField类也是一个Field类的子类,也是包含了多个FieldType对象,官方说明是:这个Field是一个索引分词,不包含term vectors,例如将被用到“body”属性,包含大量文本的Document中。

TextField类的源码

五、StoredField类

1、  类概述

同StringField类一样,官方说明是:一个字段的值被存储,所以可以通过

IndexSearcher.doc和IndexReader.document获得这个Field的值。

2、类源码:

构造函数基本与父类一致。

六、IntField类

1、  类概述

官方说明:int类型的Field在一个有效的范围内过滤和排序,下面是一个例子:

document.add(new IntField(name, 6, Field.Store.NO));

为了获得最佳性能,使用一个IntField和Document实例来保存多个文档,例子如下:

2、源码

七、LongField类

1、  类概述

基本与IntField一样,例子也一样,就是把IntField改成LongField。

2、  源码

源码结构也一样。

八、DoubleField类

1、  类概述

与IntField和Long一样。

2、  源码

源码结构也一样。

九、FloatField类

同以上三种一样。

十、NumericDocValuesField类

1、 类概述

官方概述:这个Field用于每个Document添加一个long类型的值用于评分、排序或者索引值,例子如下:

document.add(new NumericDocValuesField(name, 22L));

如果你需要去存储这个值,你应该添加一个单独的StoredField实例。

2、  源码

从源码也可以看出它是不存储的。

十一、FieldType类

1、  类的概述

该类主要是配置Field类来使用的,例如:是否储存,是否索引,是否分词等。

还有一个重要的方法freeze(),用来阻止Field在实例化后完成前修改。

2、  内部类

FieldType类包含一个内部的枚举类型NumericType来表示数字类型,值分别是,INT,LONG,FlOAT,DOUBLE。

3、  FieldType还用到了一个IndexOptions枚举类型,他有四个值,分别是:

DOCS_ONLY

文档只包含索引,位置和词频将忽略,查询短语和位置信息将引起异常

DOCS_AND_FREQS

文档只包含索引和词频,位置将忽略,这个可以正常评分,查询短语和位置也将引发异常

DOCS_AND_FREQS_AND_POSITIONS

文档包含索引位置和词频,这是一个典型的默认为全文搜索:全部启用评分和位置查询的支持。

DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS

文档包含索引、位置、词频和偏移量。

至此Field类的情况就基本上介绍完了。有什么不对或者不完善的地方欢迎指正。


© 著作权归作者所有

共有 人打赏支持
一枚Sir
粉丝 116
博文 207
码字总数 350904
作品 0
朝阳
架构师
Lucene4入门(1)

Lucene4.4入门(1) Lucene主要分为三大块: 1、创建索引 2、分词 3、读取并查询索引 我们今天的入门主要讲创建索引和读取查询索引,使用的Lucene的版本是4.4。 第一步:创建一个java工程添加l...

一枚Sir ⋅ 2014/04/10 ⋅ 0

JAVA反射系列之Field,java.lang.reflect.Field使用获取方法。

首先必须明一点 Field类主要是用来辅助获取和操作类的属性的! 1.怎么通过反射获取类的属性 先来看JDK提供的方法有如下几种: 返回一个包含某些 对象的数组,这些对象反映此 对象所表示的类或...

Josean_Luo ⋅ 2014/03/18 ⋅ 2

Scala笔记整理(四):Scala面向对象—类详解2(继承相关)

[TOC] 单例 希望某个类只存在一个使用的对象,而不管有多少个调用者在使用它,就是单例的概念。 Java中的单例 Scala中的单例 代码及说明如下: 输出结果如下: 伴生类和伴生对象 直接看下面的...

xpleaf ⋅ 04/20 ⋅ 0

Lucene4入门学习资料

分享几节Lucene4入门学习资料,一起学习! 地址:http://yunpan.cn/QXLCTt2A4w7QB

小人不才 ⋅ 2013/08/23 ⋅ 4

Lucene 的 Scoring 评分机制

Lucene 评分体系/机制(lucene scoring)是 Lucene 出名的一核心部分。它对用户来说隐藏了很多复杂的细节,致使用户可以简单地使用 lucene。但个人觉得:如果要根据自己的应用调节评分(或结...

小编辑 ⋅ 2010/02/27 ⋅ 0

lucene4.0如何统计热词

项目有个需求,比如有一个用户留言表leavemsg[id,content,userid], 要实现统计content里出现频率在前10的热词,以及它出现的记录的总数。 我的解决思路遇到点问题: 1. 新增记录的时候,提交...

jkluooop ⋅ 2015/05/15 ⋅ 0

《重构-改善既有代码的设计》读书笔记(二)

12、Lazy Class – 冗赘类 对于几乎没有用的类,运用inline class 将其功能移动。去除这些不值得维护的类。 13、Speculative Generality – 夸夸其谈未来性 对于你现在用不到,觉得总有一天会...

技术小牛人 ⋅ 2017/11/16 ⋅ 0

Scala简单编程

1. Scala简单概述 Scala是多范式编程语言,其设计的初衷是要集成面向对象编程和函数式编程以及各种特性. 需要说明的一点是: Scala是基于java平台(JVM) ,并兼容现有的Java程序 下面是Scala官方...

得失与否 ⋅ 01/01 ⋅ 0

如何使用SpringMVC进行数据校验

前言: SpringMVC数据校验采用JSR-303校验。 • Spring 4.0 拥有自己独立的数据校验框架,同时支持 JSR 303 标准的校验框架。 • Spring 在进行数据绑定时,可同时调用校验框架完成数据校 验...

帅得拖网速 ⋅ 2016/09/01 ⋅ 0

lucene 入门整理

概述 Lucene是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。Lucene以其方便使用、快速实施以及灵活性受到广泛的关注。它可以方便地嵌入到各种应用中实现针对应用的全文索引、检...

Lucups ⋅ 2013/08/12 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring Email

使用spring发Email其实就是使用spring自己封装携带的一个javamail.JavaMailSenderImpl类而已。这个类可以当一个普通的java对象来使用,也可以通过把它配置变成spring Bean的方式然后注入使用...

BobwithB ⋅ 22分钟前 ⋅ 0

spark 整理的一些知识

Spark 知识点 请描述spark RDD原理与特征? RDD全称是resilient distributed dataset(具有弹性的分布式数据集)。一个RDD仅仅是一个分布式的元素集合。在Spark中,所有工作都表示为创建新的...

tuoleisi77 ⋅ 25分钟前 ⋅ 0

思考

时间一天天过感觉自己有在成长吗?最怕的是时光匆匆而过,自己没有收获!下面总结下最近自己的思考。 认识自己 认识另一个自己,人们常说要虚心听取别人意见和建议。然而人往往是很难做到的,...

hello_hp ⋅ 26分钟前 ⋅ 0

IT行业的变革就像世界杯德国对战墨西哥一样难以预测[图]

最近在观看世界杯,尤其是昨天的比赛,上一届卫冕冠军德国队居然0:1告负墨西哥,这创造了历史,首先是墨西哥从来没赢过德国队,其次是德国队36年来首站没输过,再差也是打平,而这次,德国队...

原创小博客 ⋅ 45分钟前 ⋅ 0

解决CentOS6、7,/etc/sysconfig/下没有iptables的问题

一、Centos 6版本解决办法: 1.任意运行一条iptables防火墙规则配置命令: iptables -P OUTPUT ACCEPT 2.对iptables服务进行保存: service iptables save 3.重启iptables服务: service ...

寰宇01 ⋅ 55分钟前 ⋅ 2

数据库备份和恢复

备份:mysqldump -u root -p 数据库>磁盘路径 恢复:mysql -u root -p 数据库<sql脚本的磁盘路径

anlve ⋅ 今天 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部