Field就像我们学过的数据库中的字段,简单的说,就是一个名值对。这个域有三种属性,分别是
isStored - 是否被存储
isIndexed - 是否被索引
isTokenized - 是否分词
这些属性的组合又构成了四种不同类型的Field,而且各有用途
|
Stored |
Indexed |
Tokenized |
Keyword |
Y |
Y |
N |
UnIndexed |
Y |
N |
N |
UnStored |
N |
Y |
Y |
Text: String |
Y |
Y |
Y |
Text : Reader |
N |
Y |
Y |
1.4.3版本中的下面方法都被Field(String name, String value, Store store, Index index, TermVector termVector)取代
Keyword(String name, String value) // only version 1.4.3
存储、索引、不分词,用于URI(比如MSN聊天记录的日期域、比如MP3文件的文件全路径等等)
Field(String name, String value, Field.Store.YES, Field.Index.UN_TOKENIZED) // version 2.0.0
UnIndexed(String name, String value) // only version 1.4.3
存储、不索引、不分词,比如文件的全路径
Field(String name, String value,Field.Store.YES, Field.Index.NO) // version 2.0.0
UnStored(String name, String value) // only version 1.4.3
不存储、索引、分词,比如HTML的正文、Word的内容等等,这部分内容是要被索引的,但是由于具体内容通常很大,没有必要再进行存储,可以到时候根据URI再来挖取。所以,这部分只分词、索引,而不存储。
Field(String name, String value,Field.Store.NO, Field.Index.TOKENIZED)// version 2.0.0
Text(String name, String value) // only version 1.4.3
存储、索引、分词,比如文件的各种属性,比如MP3文件的歌手、专辑等等。Field.Store.YES, Field(String name, String value,Field.Index.TOKENIZED)// version 2.0.0
Text(String name, Reader value) // only version 1.4.3
Field(String name, Reader reader) // version 2.0.0不存储、索引、分词。
(说法一)最近用Lucene开发全文检索。《Lucene in Action》这本书用的是Lucene 1.4。我自己下的是最新的2.1。然后就发现了很多不同的地方。
Field没了Keyword、UnIndexed、UnStored、Text这几个静态成员,只能用 Field(String, String, Store, Index)。 Keyword对应Field.Store.YES, Field.Index.UN_TOKENIZED, UnIndexed 对应Field.Store.YES, Field.Index.NO, UnStored对应Field.Store.NO, Field.Index.TOKENIZED, Text对应Field.Store.YES, Field.Index.TOKENIZED。 FSDirectory.getDirectory的有两个参数的变成了depresed 了。现在要用只有一个参数的。 BooleanQuery的add方法也变了。原来是用两个boolean值组合的,现在 使用BooleanClause.Occur的几个静态成员了。 暂时就发现这点差异。[引自:http://syre.blogbus.com/logs/4736803.html] (说法二)Field类一共有5种构造函数: Field(String name, byte[] value, Field.Store store) Create a stored field with binary value. Field(String name, Reader reader) Create a tokenized and indexed field that is not stored. Field(String name, Reader reader, Field.TermVector termVector) Create a tokenized and indexed field that is not stored, optionally with storing term vectors. Field(String name, String value, Field.Store store, Field.Index index) Create a field by specifying its name, value and how it will be saved in the index. Field(String name, String value, Field.Store store, Field.Index index, Field.TermVector termVector) Create a field by specifying its name, value and how it will be saved in the index. 其中: Field.Store 表示“是否存储”,即该Field内的信息是否要被原封不动的保存在索引中。 Field.Index 表示“是否索引”,即在这个Field中的数据是否在将来检索时需要被用户检索到,一个“不索引”的Field通常仅是提供辅助信息储存的功能。 Field.TermVector 表示“是否切词”,即在这个Field中的数据是否需要被切词。 通常,参数用Reader,表示在文本流数据源中获取数据,数据量一般会比较大。像链接地址URL、文件系统路径信息、时间日期、人名、居民身份 证、电话号码等等通常将被索引并且完整的存储在索引中,但一般不需要切分词,通常用上面的第四个构造函数,第三四个参数分别为 Field.Store.YES, Field.Index.YES。而长文本通常可用第3个构造函数。引用[http: //blog.youkuaiyun.com/colasnail/archive/2007/03/21/1536417.aspx] (说法三) 1. 2.0以前的版本 UnIndexed: Field的值将被保存到索引文件,不为Field的值建立索引,因此不能通过该Field搜索文档。 UnStored: Field的值不被保存到索引文件,将Field的值分词后建立索引 Text: Field的值分词后建立索引。如果参数为String值将被保存,为Reader值不被保存 2. 2.0版本 用几个内部类的组合来区分Field的具体类型。 Store COMPRESS:压缩保存。用于长文本或二进制数据 YES:保存 NO:不保存 Index NO:不建索引 TOKENIZED:分词,建索引 UN_TOKENIZED:不分词,建索引 NO_NORMS:不分词,建索引。但是Field的值不像通常那样被保存,而是只取一个byte,这样节约存储空间 TermVector NO:不保存term vectors YES:保存term vectors。 WITH_POSITIONS:保存term vectors。(保存值和token位置信息) WITH_OFFSETS:保存term vectors。(保存值和Token的offset)WITH_POSITIONS_OFFSETS:保存term vectors。(保存值和token位置信息和Token的offset) (说法四) 关于 Field , 2.0.0 版本和 1.4.3 版本方法相比改动比较大,具体见下表 1.4.3 版本中的下面方法都被 Field(String name, String value, Store store, Index index, TermVector termVector) 取代 Keyword(String name, String value) // only version 1.4.3 存储、索引、不分词,用于 URI (比如 MSN 聊天记录的日期域、比如 MP3 文件的文件全路径等等) Field(String name, String value, Field.Store.YES, Field.Index.UN_TOKENIZED) // version 2.0.0 UnIndexed(String name, String value) // only version 1.4.3 存储、不索引、不分词,比如文件的全路径 Field(String name, String value,Field.Store.YES, Field.Index.NO)// version 2.0.0 UnStored(String name, String value) // only version 1.4.3 不存储、索引、分词,比如 HTML 的正文、 Word 的内容等等,这部分内容是要被索引的,但是由于具体内容通常很大,没有必要再进行存储,可以到时候根据 URI 再来挖取。所以,这部分只分词、索引,而不存储。 Field(String name, String value,Field.Store.YES, Field.Index.TOKENIZED)// version 2.0.0 Text(String name, String value) // only version 1.4.3 存储、索引、分词,比如文件的各种属性,比如 MP3 文件的歌手、专辑等等。 Field.Store.YES, Field(String name, String value,Field.Index.TOKENIZED)// version 2.0.0 Text(String name, Reader value) // only version 1.4.3 Field(String name, Reader reader) // version 2.0.0 不存储、索引、分词。 (说法五) 1. 2.0 以前的版本 Keyword: Field 的值将被保存到索引文件,为Field的值建立索引,建立索引时不需要分词。 UnIndexed: Field 的值将被保存到索引文件,不为Field的值建立索引,因此不能通过该Field搜索文档。 UnStored: Field 的值不被保存到索引文件,将Field的值分词后建立索引 Text: Field 的值分词后建立索引。如果参数为String值将被保存,为Reader值不被保存 2. 2.0 版本 用几个内部类的组合来区分Field的具体类型。 Store ² COMPRESS: 压缩保存。用于长文本或二进制数据 ² YES :保存 ² NO :不保存 Index ² NO :不 建索引 ² TOKENIZED :分词, 建索引 ² UN_TOKENIZED :不分词, 建索引 ² NO_NORMS :不分词, 建索引。但是Field的值不像通常那样被保存,而是只取一个byte,这样节约存储空间 TermVector ² NO : 不保存term vectors ² YES : 保存term vectors。 ² WITH_POSITIONS : 保存term vectors。(保存值和token位置信息) ² WITH_OFFSETS : 保存term vectors。(保存值和Token的offset)WITH_POSITIONS_OFFSETS:保存term vectors。(保存值和token位置信息和Token的offset) (说法六) * Field.Index有四个属性,分别是: Field.Index.TOKENIZED:分词索引 Field.Index.UN_TOKENIZED:分词进行索引,如作者名,日期等,Rod Johnson本身为一单词,不再需要分词。 Field.Index:不进行索引,存放不能被搜索的内容如文档的一些附加属性如文档类型, URL等。 Field.Index.NO_NORMS:; Field.Store也有三个属性,分别是: Field.Store.YES:索引文件本来只存储索引数据, 此设计将原文内容直接也存储在索引文件中,如文档的标题。 Field.Store.NO:原文不存储在索引文件中,搜索结果命中后,再根据其他附加属性如文件的Path,数据库的主键等,重新连接打开原文,适合原文内容较大的情况。 Field.Store.COMPRESS 压缩存储; termVector是Lucene 1.4.3新增的它提供一种向量机制来进行模糊查询,很少用。 |