叶明的javablog

java学习天堂,个人关于其他blog:blog.javaworker.cn,欢迎大家访问
posts - 64, comments - 50, trackbacks - 0, articles - 3

Lucene(2.4.1)技术研究(4)--Field源代码

Posted on 2009-03-31 10:48 天空苍茫 阅读(1992) 评论(0)  编辑  收藏 所属分类: java知识

Field类(类似数据库中的字段与属性)
    该类实现接口:Fieldable    继承静态类: AbstractField
    Fieldable接口。主要是描述一些基础信息的内容
        设置权重以及获取权重 [void setBoost(float boost), float getBoost();]
        获取名称String name();
        获取String类型的值public String stringValue();
        以Reader方式返回public Reader readerValue();
        以二进制或者TokenStream  方式返回public byte[] binaryValue();public TokenStream       tokenStreamValue();
        是否被存储boolean  isStored();
        是否被索引boolean  isIndexed();
        是否被分词boolean  isTokenized();
        是否是压缩存储 boolean  isCompressed();
        是否是二进制boolean  isBinary();
           ......其他的读者可以参考源代码
AbstractField抽象类定义的一些常量:
          protected String name = "body";                        //表示该Filed的名称
          protected boolean storeTermVector = false;    //表示是否存储词条向量
          protected boolean storeOffsetWithTermVector = false;  //存储词条向量的偏移量
          protected boolean storePositionWithTermVector = false;  //存储词条向量的位置
          protected boolean omitNorms = false;     //
          protected boolean isStored = false;      //是否存储
          protected boolean isIndexed = true;      //是否是索引
          protected boolean isTokenized = true;     //是否是分词
          protected boolean isBinary = false;      //是否是二进制数据
          protected boolean isCompressed = false;     //是否是压缩
          protected boolean lazy = false;      //是否是延迟
          protected boolean omitTf = false;     //
          protected float boost = 1.0f;      //设置激励因子
          protected Object fieldsData = null;     //Field的内部属性的具体内容
          protected int binaryLength;       //二进制数据长度
          protected int binaryOffset;       //二进制数据偏移量

Filed类源代码解析
    首先Filed内部定义了三个静态类Store、Index、TermVector。
//定一个静态类Store ,主要为了设置Field的存储属性
public static final class Store extends Parameter implements Serializable {
    private Store(String name) {
      super(name);
    }
    //使用压缩的方式来存储Field的值
    public static final Store COMPRESS = new Store("COMPRESS");
    //在索引中存储Field的值
    public static final Store YES = new Store("YES");
    //在索引中不存贮Field的值
    public static final Store NO = new Store("NO");
  }
//定一个静态类Index ,主要为了设置Field的索引属性
public static final class Index extends Parameter implements Serializable {
    private Index(String name) {
      super(name);
 }
 //不对Field进行索引,所以这个Field就不能被检索到(一般来说,建立索引而使它不被检索,这是没有意义的)
 //如果对该Field还设置了Field.Store为Field.Store.YES或Field.Store.COMPRESS,则可以检索
    public static final Index NO = new Index("NO");

    //对Field进行索引,同时还要对其进行分词(由Analyzer来管理如何分词)
    public static final Index ANALYZED = new Index("ANALYZED");
//废弃的属性,使用ANALYZED 来替代
     public static final Index TOKENIZED = ANALYZED;
//对Field进行索引,但是不对该Field使用分词
    public static final Index NOT_ANALYZED = new Index("NOT_ANALYZED");
//废弃的属性,使用NOT_ANALYZED来替代
    public static final Index UN_TOKENIZED = NOT_ANALYZED;
//即不对Field索引,也不对其使用Analyzer来分词
    public static final Index NOT_ANALYZED_NO_NORMS = new  Index("NOT_ANALYZED_NO_NORMS");
//废弃的属性,有NOT_ANALYZED_NO_NORMS来替代
    public static final Index NO_NORMS = NOT_ANALYZED_NO_NORMS;
//对Field属性,使用分词,但是不是使用Analyzer来分词
    public static final Index ANALYZED_NO_NORMS = new Index("ANALYZED_NO_NORMS");
  }
这是一个与词条有关的类。因为在检索的时候需要指定检索关键字,通过为一个Field添加一个TermVector,就可以在检索中把该Field检索到。
public static final class TermVector  extends Parameter implements Serializable {
    private TermVector(String name) {
      super(name);
    }
    //不存储
    public static final TermVector NO = new TermVector("NO");
    //为每个Document都存储一个TermVector
    public static final TermVector YES = new TermVector("YES");
    //存储,并且存在位置信息
    public static final TermVector WITH_POSITIONS = new TermVector("WITH_POSITIONS");
    //存储,并且存贮偏移量信息
    public static final TermVector WITH_OFFSETS = new TermVector("WITH_OFFSETS");
    //存储位置、偏移量等所有信息
    public static final TermVector WITH_POSITIONS_OFFSETS = new TermVector("WITH_POSITIONS_OFFSETS");
  }

构造函数
 public Field(String name, String value, Store store, Index index)  
public Field(String name, String value, Store store, Index index, TermVector termVector)
public Field(String name, Reader reader)
public Field(String name, Reader reader, TermVector termVector)
public Field(String name, TokenStream tokenStream)
public Field(String name, TokenStream tokenStream, TermVector termVector)
 public Field(String name, byte[] value, Store store)
public Field(String name, byte[] value, int offset, int length, Store store)

流程:
首先检查name以及values不能为空以及Nnull。
然后检查是否是存储以及是否分词如果两者都是No,则抛出异常。
然后检查是否存储以及是否向量分词,如果两者都是No',则抛出异常。
然后将该Filed的名称命令传递过来的名称源代码(this.name = name.intern)
表示获取JVM String常量池的地址
此时根据Store的值,来设置是否存储以及压缩的值
然后根据Index的值,来设置是否索引、是否分词、omitNorms  的值以及置是否是二进制
然后开始根据TermVector 的值,来设置是否存储向量、是否存储偏移量、是否存储位置等信息。


以上信息可能存在分析不正确,请大家给指证,本人英语有不怎么好,


只有注册用户登录后才能发表评论。


网站导航: