专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » lucene2.4.1:Lucene(2.4.1)技术研究(4)--Field源代码 »正文

lucene2.4.1:Lucene(2.4.1)技术研究(4)--Field源代码

来源: 发布时间:星期三, 2009年4月1日 浏览:2次 评论:0
  Field类(类似数据库中字段和属性)

   该类实现接口:Fieldable    继承静态类: AbstractField

   Fieldable接口主要是描述些基础信息内容

        设置权重以及获取权重 [void Boost(float boost), float getBoost;]
        获取名称String name;
        获取String类型值public String Value;
        以Reader方式返回public Reader readerValue;
        以 2进制或者TokenStream  方式返回public binaryValue;public TokenStream       tokenStreamValue;
        是否被存储boolean  isStored;
        是否被索引boolean  isIndexed;
        是否被分词boolean  isTokenized;
        是否是压缩存储 boolean  isCompressed;
        是否是 2进制boolean  isBinary;


   ......其他读者可以参考源代码

  AbstractField抽象类定义些常量:

          protected String name = "body";                        //表示该Filed名称
          protected boolean storeTermVector = false;    //表示是否存储词条向量
          protected boolean storeOffWithTermVector = 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;      //是否是 2进制数据
          protected boolean isCompressed = false;     //是否是压缩
          protected boolean lazy = false;      //是否是延迟
          protected boolean omitTf = false;     //
          protected float boost = 1.0f;      //设置激励因子
          protected Object fieldsData = null;     //Field内部属性具体内容
          protected binaryLength;       // 2进制数据长度
          protected binaryOff;       // 2进制数据偏移量


  Filed类源代码解析

   首先Filed内部定义了 3个静态类Store、Index、TermVector

//定个静态类Store 主要为了设置Field存储属性
public final Store extends Parameter implements Serializable {
    private Store(String name) {
      super(name);
    }
    //使用压缩方式来存储Field
    public final Store COMPRESS = Store("COMPRESS");
    //在索引中存储Field
    public final Store YES = Store("YES");
    //在索引中不存贮Field
    public final Store NO = Store("NO");
  }
//定个静态类Index 主要为了设置Field索引属性
public final Index extends Parameter implements Serializable {
    private Index(String name) {
      super(name);
 }
 //不对Field进行索引所以这个Field就不能被检索到(般来说建立索引而使它不被检索这是没有意义)
 //如果对该Field还设置了Field.Store为Field.Store.YES或Field.Store.COMPRESS则可以检索
    public final Index NO = Index("NO");

    //对Field进行索引同时还要对其进行分词(由Analyzer来管理如何分词)
    public final Index ANALYZED = Index("ANALYZED");
//废弃属性使用ANALYZED 来替代
     public final Index TOKENIZED = ANALYZED;
//对Field进行索引但是不对该Field使用分词
    public final Index NOT_ANALYZED = Index("NOT_ANALYZED");
//废弃属性使用NOT_ANALYZED来替代
    public final Index UN_TOKENIZED = NOT_ANALYZED;
//即不对Field索引也不对其使用Analyzer来分词
    public final Index NOT_ANALYZED_NO_NORMS =   Index("NOT_ANALYZED_NO_NORMS");
//废弃属性有NOT_ANALYZED_NO_NORMS来替代
    public final Index NO_NORMS = NOT_ANALYZED_NO_NORMS;
//对Field属性使用分词但是不是使用Analyzer来分词
    public final Index ANALYZED_NO_NORMS = Index("ANALYZED_NO_NORMS");
  }


  这是个和词条有关在检索时候需要指定检索关键字通过为个Field添加个TermVector就可以在检索中把该Field检索到

public final TermVector  extends Parameter implements Serializable {
    private TermVector(String name) {
      super(name);
    }
    //不存储
    public final TermVector NO = TermVector("NO");
    //为每个Document都存储个TermVector
    public final TermVector YES = TermVector("YES");
    //存储并且存在位置信息
    public final TermVector WITH_POSITIONS = TermVector("WITH_POSITIONS");
    //存储并且存贮偏移量信息
    public final TermVector WITH_OFFSETS = TermVector("WITH_OFFSETS");
    //存储位置、偏移量等所有信息
    public final TermVector WITH_POSITIONS_OFFSETS = 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, value, Store store)
public Field(String name, value, off, length, Store store)




  流程:

  首先检查name以及values不能为空以及Nnull

  然后检查是否是存储以及是否分词如果两者都是No则抛出异常

  然后检查是否存储以及是否向量分词如果两者都是No'则抛出异常

  然后将该Filed名称命令传递过来名称源代码(this.name = name.ern)

  表示获取JVM String常量池地址

  此时根据Store来设置是否存储以及压缩

  然后根据Index来设置是否索引、是否分词、omitNorms  值以及置是否是 2进制

  然后开始根据TermVector 来设置是否存储向量、是否存储偏移量、是否存储位置等信息

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

  系列文章:

  Lucene(2.4.1)技术研究(1)--lucene技术

  Lucene(2.4.1)技术研究(2)--分析事例

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



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: