先看一段lucene3代码
Document doc = new Document();
doc.add(new Field("fullpath", f.getCanonicalPath(),
Field.Store.YES, Field.Index.NOT_ANALYZED))
Field类是文档索引期间很重要的类,控制着被索引的域值
Field.Store.* 域存储选项通过倒排序索引来控制文本是否可以搜索
变量名 | 释义 |
Index.ANALYZED | 使用分析器将域值分解成独立的语汇单元流,并使每个语汇单元都能被搜索,适用于普通文本域 |
Index.NOT_ANALYZED | 对域进行索引,但不对String进行分析,将域值作为单一的语汇单元,适用于索引那些不能被分解的域值,如URL,文件路径,电话号码等 |
Index.ANALYZED_NO_NORMS | 不会在索引中存储norms信息,norms记录了索引中的index-time boost信息,当你进行搜索时比较费内存 |
Index.NOT_ANALYZED_NO_NORMS | 同上,也不存储norms信息,在搜索时减少索引空间和内存耗费Index.No 使对应的域值不被搜索 |
Index.No | 使对应的域值不被搜索 |
Field.Index.* 域索引选项确定是否要存储域的真实值,以便后续继续搜索时能恢复这个
变量名 | 释义 |
Stroe.YES | 存储域值,该情况下原始字符串全部被保存在索引中,对需要展示搜索结果的域有用,如URL,标题 |
Stroe.NO | 不存储域值,通常跟Index.ANALYZED共同用来索引大的文本域值,不用恢复为初始格式 |
在lucene4中 ,这种写法已经不合适了
doc.add(new Field("contents", new FileReader(f), TextField.TYPE_NOT_STORED)); //索引文件内容
变量名 | 释义 |
TYPE_NOT_STORED | 索引,分词,不存储 |
TYPE_STORED |
索引,分词,存储
|
TextField源代码对应的定义,可以看出来,它其实包含了lucene3中域存储选项和域索引选项
static {
TYPE_NOT_STORED.setIndexed(true);
TYPE_NOT_STORED.setTokenized(true);
TYPE_NOT_STORED.freeze();
TYPE_STORED.setIndexed(true);
TYPE_STORED.setTokenized(true);
TYPE_STORED.setStored(true);
TYPE_STORED.freeze();
}
但是对于特殊的要求,比如路径,则不需要索引,要分类,我们就得手动去设置Field的熟悉了
FieldType fieldType = new FieldType();
fieldType.setIndexed(false);//set 是否索引
fieldType.setStored(true);//set 是否存储
fieldType.setTokenized(true);//set 是否分类
doc.add(new Field("fullpath", f.getCanonicalPath(), fieldType)); //索引完整路径