Field即Lucene索引文档里的域,一个文档Document可以包含多个Field域,你可以类比数据库表里可以有多个字段来理解,虽然两者不能等同,但有助于你理解每个Field包含3部分信息:域的名称,域的类型,域的值,
域的值可以是String,java.io.Reader,TokenStream,可以是byte[]字节数组,可以是数字等等,而域的类型则是有IndexableFieldType类表示的,域的名称就没什么好说的了。
为了方便我们创建Field,Lucene为我们提供了各种Field子类,如IntField, LongField, FloatField, DoubleField, BinaryDocValuesField, NumericDocValuesField, SortedDocValuesField, StringField, TextField, StoredField. 初学者看到这么多Field,估计就蒙了,什么时候该用什么Field呢。要弄清楚这些,你首先要弄清楚Field类里面的内部类里的Field.Index和Field.Store的相关静态变量的含义,
@Deprecated public static enum Index { /** Do not index the field value. This field can thus not be searched, * but one can still access its contents provided it is * {@link Field.Store stored}. */ NO { @Override public boolean isIndexed() { return false; } @Override public boolean isAnalyzed() { return false; } @Override public boolean omitNorms() { return true; } }, /** Index the tokens produced by running the field's * value through an Analyzer. This is useful for * common text. */ ANALYZED { @Override public boolean isIndexed() { return true; } @Override public boolean isAnalyzed() { return true; } @Override public boolean omitNorms() { return false; } },
isIndexed:表示是否创建索引
isAnalyzed:表示是否进行分词处理
omitNorms:表示是否忽略域的标准化,这个概念是很多人很迷惑的。其实这个选项有关域的权重计算的,如果你忽略了域的标准化操作,那么在创建索引的时候就不会在域里面多开辟一个字节的空间来存储起加权编码值,因为它会多开辟一个字节的空间,所以会稍微增加了内存占用,如果你的Field都不需要额外的设置权重(注:field.setBoot(1.2)通过这样来设置域的权重值),那么你就可以设置忽略域的标准化操作,即可以减小内存占用,但它也会潜在的影响域的评分。
public static enum Store { /** Store the original field value in the index. This is useful for short texts * like a document's title which should be displayed with the results. The * value is stored in its original form, i.e. no analyzer is used before it is * stored. */ YES, /** Do not store the field's value in the index. */ NO }
Store有两个枚举值YES和NO,上面有解释说明,大概意思就是Store.YES表示会在索引中存储域的原始值,
这对于比较短的文本是很有用的比如title,被存储后它才能在查询后返回的结果中显示出来。Store.NO则反之。说的再通俗点,就是把域的原始值复制一份IO写入到硬盘上的索引文件里,方便你查询的时候能再次还原显示原始的域的值。比如新闻标题你可能希望能在查询结果里显示出来,但一般新闻内容因为文本太大且也不会需要显示原始值,像这样的域就不适合存储到索引中。
再个就是对于NumericDocValuesField这种DocValues域是干嘛的,有部分人估计也会晕,其实不必觉得晕,看看源码以及里面的注释你就懂了。
/** * <p> * Field that stores a per-document <code>long</code> value for scoring, * sorting or value retrieval. Here's an example usage: * * <pre class="prettyprint"> * document.add(new NumericDocValuesField(name, 22L)); * </pre> * * <p> * If you also need to store the value, you should add a * separate {@link StoredField} instance. * */ public class NumericDocValuesField extends Field
上面的注释意思是这个field作用就是用于 为每个Document存储一个这样的Field,这个field会存储一个long值,可以利用它来实现排序和打分。如果你需要去存储这个值,你应该再add添加一个单独的StoredField实例。
理解了这些,你就知道什么时候该用什么类型的Field了。
Java.util.Date该用什么field呢?这也是被问的频率比较高的一个问题,Lucene并没有提供DateField,请使用LongField代替,把Date转成毫秒数就OK了。有关Field今天就说这么多,后续我想到了再补充。
如果你还有什么问题请加我Q-Q:7-3-6-0-3-1-3-0-5,
或者加裙
欢迎加入一起学习交流。
相关推荐
《Lucene5学习之评分Scoring》 在信息检索领域,Lucene是一个广泛使用的全文搜索引擎库,尤其在Java开发中应用颇广。在Lucene 5版本中,对于搜索结果的排序和评分机制进行了优化,使得搜索体验更加精准。本文将深入...
本文将主要围绕Java Lucene进行深入探讨,并基于提供的“Lucene学习源码.rar”文件中的“Lucene视频教程_讲解部分源码”展开讨论。 一、Lucene核心概念 1. 文档(Document):Lucene中的基本单位,用于存储待检索...
**Lucene学习指南** Lucene是一个高性能、全文检索库,由Apache软件基金会开发并维护,是Java编程语言中广泛使用的搜索引擎库。它提供了一个简单的API,使得开发者能够方便地在应用中实现全文检索功能。本篇文章将...
本文将深入探讨Lucene 4.8的核心特性、使用方法以及相关的学习资料和案例,旨在帮助读者更好地理解和应用这一技术。 一、Lucene 4.8基础概念 1. 文档(Document):Lucene中的基本单位,用于存储信息,可以理解为...
【Lucene 3.6 学习笔记】 Lucene 是一个高性能、全文本搜索库,广泛应用于各种搜索引擎的开发。本文将深入探讨Lucene 3.6...通过学习这些内容,可以深入理解Lucene的工作机制,并利用其强大的搜索能力构建高效的应用。
在学习 Lucene 源码时,理解以下几个关键概念至关重要: 1. **倒排索引**:这是 Lucene 的核心数据结构,它存储了每个术语出现的所有文档及其位置信息,使高效的全文搜索成为可能。 2. **Analyzer**:分析器负责将...
这个压缩包包含了丰富的Lucene学习资源,包括文档、配置文件和源代码,可以帮助我们深入了解Lucene的核心功能和使用方法。 **Lucene基本概念** 1. **索引(Index)**:Lucene通过构建索引来实现快速的文本搜索。...
在深入探讨“Lucene学习-02”这一主题之前,我们先来理解一下Lucene的核心概念。Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,广泛应用于各种搜索引擎和信息检索系统。它提供了文本分析、索引构建、...
**Lucene入门学习文档** **一、什么是Lucene** Lucene是Apache软件基金会下的一个开源全文检索库,它提供了一个高...通过阅读"Lucene学习文档",你可以一步步了解并掌握这些知识,逐步成为一个熟练的Lucene开发者。
这个“lucene基本包”是探索和学习Lucene的第一步,其中可能包含了Lucene的JAR文件和其他必要的资源,供开发者在实际项目中导入和使用。通过深入理解并实践这些核心概念和功能,开发者可以充分利用Lucene的强大能力...
1. **索引(Index)**:Lucene的核心功能之一是构建索引,将文本数据转化为可搜索的结构。索引是一个倒排索引,其中每个词项都有一个指向包含该词项的文档列表的指针,这种设计极大地提高了搜索速度。 2. **分析器...
5. **查询解析器(Query Parser)**:用户输入的查询字符串经过查询解析器处理,转化为 Lucene 可理解的查询对象。 6. **搜索器(Searcher)**:搜索器负责执行查询,计算相关性评分,并返回匹配的文档。 7. **...
Apache Lucene 是一个高效的开源信息检索库,用于在应用程序中提供全文搜索功能。...尽管文档的内容由于OCR扫描而存在一定的错误和遗漏,但以上概述提供了一个对Lucene核心概念和功能的较为清晰的理解。
《Lucene5.21与IkAnalyzer2012_V5入门详解》 在信息技术领域,数据检索和...希望这个入门案例能帮助你开启Lucene和IkAnalyzer的探索之旅,如果你在实践中遇到困难,欢迎进一步学习和研究,不断提升自己的技术实力。
`IndexWriter` 是 Lucene 中的核心类之一,用于创建或更新索引。它提供了添加文档、删除文档、优化索引等操作的功能。 **1.1.2 Directory** `Directory` 在 Lucene 中代表了存储索引的地方,可以是硬盘上的文件...
《Lucene 3.5 学习笔记》 在信息技术高速发展的今天,搜索引擎技术成为了信息检索的核心工具。Apache Lucene,作为一个开源全文...深入学习和理解Lucene的原理和使用,将有助于开发者构建高效、智能的信息检索系统。
《深入理解Lucene 2.9.1:构建与搜索的全方位解析》 Lucene,作为一款开源的全文搜索引擎库,被广泛应用于各种信息检索场景。本文将详细讲解Lucene 2.9.1版本的核心概念、架构以及索引创建与搜索的流程。 一、...
**Lucene学习总结** 在深入理解Lucene之前,我们首先需要了解什么是全文检索。全文检索是一种从大量文本数据中快速查找所需信息的技术。它通过建立索引来实现高效的搜索,而Lucene正是Java环境下最著名的全文搜索...
下面通过两个示例来进一步理解 Lucene 的工作原理: **建立文件索引:** ```java public void testIndexHello() throws IOException { Date date1 = new Date(); IndexWriter writer = new IndexWriter("c:\\\\...