lucene中Field简析

本文主要探讨Lucene中Field类的重要角色,分析其在文档索引过程中的作用。随着版本更新,Lucene3的Field使用方式在Lucene4中有所变化,TextField的定义结合了存储和索引选项。对于特定场景,如路径字段,可能需要自定义Field的设置以实现分类需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值