Field也许算是Lucene索引阶段最重要的类,它是存储被索引值的类。当创建Field时,Lucene为其提供了诸多选项供你选择。
1. 索引
索引选项(Field.Index.*)用来控制域中的文本如何通过反向索引搜索。共有如下选项:
1) Index.ANALYZED
最常用的设置,采用分词策略,将原文拆分成词元(通常用在正文、标题、摘要等域)
2) Index.NOT_ANALYZED
不采用分词策略,即把原文当作一整个词元对待(通常用在URL、文件路径、日期等域)
3) Index.ANALYZED_NO_NORMS
它是Index.ANALYZED的高级变种,在索引文件中不存储规则信息,比如一些优先策略
4) Index.NOT_ANALYZED_NO_NORMS
类似上面,它是Index.NOT_ANALYZED的高级变种
5) Index.NO
指定为此选项的域将不能被搜索到
2. 存储
存储选项(Field.Store.*)用来决定是否将域值存储起来。共有如下选项:
1) Store.YES
2) Store.NO
标识为YES的域值将会被存储在index中,搜索阶段可以用IndexReader检索到它。此选项对于需要在查询结果中显示的域非常有用(如URL、标题等)。
Lucene中包含一个非常有用的工具类,CompressionTools,它提供了压缩和解压byte数组的方法。其内部调用了java的内置java.util.Zip包中的方法。在存储之前你可以利用它先将内容压缩,但是压缩会降低索引和搜索的效率,对于很小的域值,通常并不值得去压缩。
3. 检索词向量
这个稍微麻烦一些,不展开了。选项如下:
1) TermVector.YES
2) TermVector.WITH_POSITIONS
3) TermVector.WITH_OFFSETS
4) TermVector.WITH_POSITIONS_OFFSETS
5) TermVector.NO
需要注意的是,如果设置了Index.NO, 则必须是TermVector.NO. 即前四个选项必须建立在域值可索引的基础上。
4. Field的构造器
Field的构造器有很多:
5. 小结
组合以上选项,主要有如下用法:
Index | Store | TermVector | 常见用处 |
NOT_ANALYZED | YES | NO | 文件名、URL、电话、日期等 |
ANALYZED | YES | WITH_POSITIONS_OFFSETS | 标题、摘要 |
ANALYZED | NO | WITH_POSITIONS_OFFSETS | 正文 |
NO | YES | NO | 分类、数据库主键等只用来在结果中显示的 |
NOT_ANALYZED | NO | NO | 隐藏的关键字 |