lucene中Field简析

来源:互联网 发布:罗技k260配对软件 编辑:程序博客网 时间:2024/05/20 21:22

先看一段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));     //索引完整路径