Lucene5学习之Field理解

简介:

     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的相关静态变量的含义,

Java代码   收藏代码
  1. @Deprecated  
  2.   public static enum Index {  
  3.   
  4.     /** Do not index the field value. This field can thus not be searched, 
  5.      * but one can still access its contents provided it is 
  6.      * {@link Field.Store stored}. */  
  7.     NO {  
  8.       @Override  
  9.       public boolean isIndexed()  { return false; }  
  10.       @Override  
  11.       public boolean isAnalyzed() { return false; }  
  12.       @Override  
  13.       public boolean omitNorms()  { return true;  }     
  14.     },  
  15.   
  16.     /** Index the tokens produced by running the field's 
  17.      * value through an Analyzer.  This is useful for 
  18.      * common text. */  
  19.     ANALYZED {  
  20.       @Override  
  21.       public boolean isIndexed()  { return true;  }  
  22.       @Override  
  23.       public boolean isAnalyzed() { return true;  }  
  24.       @Override  
  25.       public boolean omitNorms()  { return false; }  
  26.     },  

isIndexed:表示是否创建索引

isAnalyzed:表示是否进行分词处理

omitNorms:表示是否忽略域的标准化,这个概念是很多人很迷惑的。其实这个选项有关域的权重计算的,如果你忽略了域的标准化操作,那么在创建索引的时候就不会在域里面多开辟一个字节的空间来存储起加权编码值,因为它会多开辟一个字节的空间,所以会稍微增加了内存占用,如果你的Field都不需要额外的设置权重(注:field.setBoot(1.2)通过这样来设置域的权重值),那么你就可以设置忽略域的标准化操作,即可以减小内存占用,但它也会潜在的影响域的评分。

 

 

Java代码   收藏代码
  1. public static enum Store {  
  2.   
  3.     /** Store the original field value in the index. This is useful for short texts 
  4.      * like a document's title which should be displayed with the results. The 
  5.      * value is stored in its original form, i.e. no analyzer is used before it is 
  6.      * stored. 
  7.      */  
  8.     YES,  
  9.   
  10.     /** Do not store the field's value in the index. */  
  11.     NO  
  12.   }  

 Store有两个枚举值YES和NO,上面有解释说明,大概意思就是Store.YES表示会在索引中存储域的原始值,

 

这对于比较短的文本是很有用的比如title,被存储后它才能在查询后返回的结果中显示出来。Store.NO则反之。说的再通俗点,就是把域的原始值复制一份IO写入到硬盘上的索引文件里,方便你查询的时候能再次还原显示原始的域的值。比如新闻标题你可能希望能在查询结果里显示出来,但一般新闻内容因为文本太大且也不会需要显示原始值,像这样的域就不适合存储到索引中。

     再个就是对于NumericDocValuesField这种DocValues域是干嘛的,有部分人估计也会晕,其实不必觉得晕,看看源码以及里面的注释你就懂了。

 

Java代码   收藏代码
  1. /** 
  2.  * <p> 
  3.  * Field that stores a per-document <code>long</code> value for scoring,  
  4.  * sorting or value retrieval. Here's an example usage: 
  5.  *  
  6.  * <pre class="prettyprint"> 
  7.  *   document.add(new NumericDocValuesField(name, 22L)); 
  8.  * </pre> 
  9.  *  
  10.  * <p> 
  11.  * If you also need to store the value, you should add a 
  12.  * separate {@link StoredField} instance. 
  13.  * */  
  14.   
  15. 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,

 

或者加裙
欢迎加入一起学习交流。
 转载:     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的相关静态变量的含义,

Java代码   收藏代码
  1. @Deprecated  
  2.   public static enum Index {  
  3.   
  4.     /** Do not index the field value. This field can thus not be searched, 
  5.      * but one can still access its contents provided it is 
  6.      * {@link Field.Store stored}. */  
  7.     NO {  
  8.       @Override  
  9.       public boolean isIndexed()  { return false; }  
  10.       @Override  
  11.       public boolean isAnalyzed() { return false; }  
  12.       @Override  
  13.       public boolean omitNorms()  { return true;  }     
  14.     },  
  15.   
  16.     /** Index the tokens produced by running the field's 
  17.      * value through an Analyzer.  This is useful for 
  18.      * common text. */  
  19.     ANALYZED {  
  20.       @Override  
  21.       public boolean isIndexed()  { return true;  }  
  22.       @Override  
  23.       public boolean isAnalyzed() { return true;  }  
  24.       @Override  
  25.       public boolean omitNorms()  { return false; }  
  26.     },  

isIndexed:表示是否创建索引

isAnalyzed:表示是否进行分词处理

omitNorms:表示是否忽略域的标准化,这个概念是很多人很迷惑的。其实这个选项有关域的权重计算的,如果你忽略了域的标准化操作,那么在创建索引的时候就不会在域里面多开辟一个字节的空间来存储起加权编码值,因为它会多开辟一个字节的空间,所以会稍微增加了内存占用,如果你的Field都不需要额外的设置权重(注:field.setBoot(1.2)通过这样来设置域的权重值),那么你就可以设置忽略域的标准化操作,即可以减小内存占用,但它也会潜在的影响域的评分。

 

 

Java代码   收藏代码
  1. public static enum Store {  
  2.   
  3.     /** Store the original field value in the index. This is useful for short texts 
  4.      * like a document's title which should be displayed with the results. The 
  5.      * value is stored in its original form, i.e. no analyzer is used before it is 
  6.      * stored. 
  7.      */  
  8.     YES,  
  9.   
  10.     /** Do not store the field's value in the index. */  
  11.     NO  
  12.   }  

 Store有两个枚举值YES和NO,上面有解释说明,大概意思就是Store.YES表示会在索引中存储域的原始值,

 

这对于比较短的文本是很有用的比如title,被存储后它才能在查询后返回的结果中显示出来。Store.NO则反之。说的再通俗点,就是把域的原始值复制一份IO写入到硬盘上的索引文件里,方便你查询的时候能再次还原显示原始的域的值。比如新闻标题你可能希望能在查询结果里显示出来,但一般新闻内容因为文本太大且也不会需要显示原始值,像这样的域就不适合存储到索引中。

     再个就是对于NumericDocValuesField这种DocValues域是干嘛的,有部分人估计也会晕,其实不必觉得晕,看看源码以及里面的注释你就懂了。

 

Java代码   收藏代码
  1. /** 
  2.  * <p> 
  3.  * Field that stores a per-document <code>long</code> value for scoring,  
  4.  * sorting or value retrieval. Here's an example usage: 
  5.  *  
  6.  * <pre class="prettyprint"> 
  7.  *   document.add(new NumericDocValuesField(name, 22L)); 
  8.  * </pre> 
  9.  *  
  10.  * <p> 
  11.  * If you also need to store the value, you should add a 
  12.  * separate {@link StoredField} instance. 
  13.  * */  
  14.   
  15. 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,

 

或者加裙
欢迎加入一起学习交流。

转载:http://iamyida.iteye.com/blog/2194345

目录
相关文章
|
存储 自然语言处理 索引
lucene中Field.Index,Field.Store的一些设置
lucene在doc.add(new Field("content",curArt.getContent(),Field.Store.NO,Field.Index.TOKENIZED));
111 0
|
SQL 机器学习/深度学习 自然语言处理
全面解剖 Solr query 到lucene query
假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。围绕从顶之下,从粗到西的关系认识solr 查询流程和实现细节。最低下定位到queryparse的实现。整个过程围绕信息检索这一思路展开,而不是工程实现来看这个问题。目的从整体结构上认识查询这一块的抽象。这样有具体需求的时候,可以知晓参照按个query、从哪个点注入系统中比较省事,而无需侵入solr、lucene底层。
224 0
全面解剖 Solr query 到lucene query
|
算法 前端开发 数据建模
Solr&lucene 默认的spatial search性能总结
假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。介绍地理搜索性能优化的一些经验。
138 0
|
XML 自然语言处理 搜索推荐
使用Luke Lucene进行索引
目录 luke 简介 luke下载及安装 luke 使用 打开luke Overview选项卡 Documents选项卡 search选项卡 Commits选项卡 Plugins选项卡 导出索引为XML 检查索引正确性 总结 1. luke 简介 luke### 是一个用于Lucene/Solr/Elasticsearch 搜索引擎的,方便开发和诊断的 GUI(可视化)工具。
1406 0
Elasticsearch 多字段查询 best_fields、most_fields、cross_fields,傻傻分不清楚?
题记 Multi-match query 的目的多字段匹配,但 Multi-match query 中的 best_fields, most_fields, cross_fields 分不清楚,都什么含义? 下面我们一一举例解读。
585 0
Elasticsearch 多字段查询 best_fields、most_fields、cross_fields,傻傻分不清楚?