葉明的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 天空蒼茫 閱讀(2009) 評論(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 的值,來設置是否存儲向量、是否存儲偏移量、是否存儲位置等信息。


          以上信息可能存在分析不正確,請大家給指證,本人英語有不怎么好,

          主站蜘蛛池模板: 海丰县| 集安市| 阳新县| 科尔| 四平市| 锦屏县| 麻城市| 锡林浩特市| 边坝县| 武夷山市| 广水市| 东兰县| 元氏县| 嘉禾县| 呼图壁县| 乌拉特前旗| 绥化市| 湘西| 临西县| 多伦县| 长阳| 南川市| 盘锦市| 张北县| 赫章县| 桂平市| 昂仁县| 山东省| 张家川| 广饶县| 油尖旺区| 湘乡市| 西和县| 巢湖市| 江川县| 柳江县| 时尚| 出国| 拉孜县| 中超| 江都市|