官术网_书友最值得收藏!

2.1 構 建 索 引

為了按詞建立索引,需要對文檔分詞。把這個分詞類叫作Analyzer。文檔內容作為輸入流Reader的實例傳入。

        public class Analyzer {
            String[] split(Reader reader) {
                //對文檔內容分詞,并返回分詞后的詞數組
            }
        }

首先建立文檔索引,也就是正排索引,然后建立倒排索引。

正排索引用到的DocConsumer類如下。

        public class DocConsumer {
            public int docid; //文檔編號
            //詞到頻率的映射,頻率存在長度是1的整數數組中
            HashMap<String, int[]> frequencyList;
            int words;  //文檔長度,也就是這個文檔包含多少個詞
        }

然后建立倒排索引。倒排索引用到的Posting類如下。

        public class Posting implements Serializable {
            public int docid; //文檔編號
            public int freq; //這個詞在文檔中出現了多少次
            Posting(int doc, int freq) {
                this.docid = doc;
                this.freq = freq;
            }
        }

這里把文檔作為一個字符串,如果有多列,可以把文檔作為一個自定義的對象。

        public class Document {
                public String title; //標題列
                public String content; //內容列
        }

為了更靈活地定義文檔的結構,可以專門定義一個Field類。

        public class Field {
          /** 列名  */
          public final String name;


          /** 列值 */
          public String fieldsData;
        }

一個Document類的實例中可以包含多個Field類的實例。

在真正的信息檢索中,都是有多個列的,而且很多列有同等重要的地位。對于多個列的檢索,簡單的方法是:給每個倒排列附加一個bit-map,假設有N列,則Bitmap長度是N。例如,title出現,則第1位為1, content沒出現,則第2位為0。實際的做法是:把一個列中所有的詞連續存放到一起,一個專門的列定義文件中包括某個列中這些詞信息的開始位置,如圖2-2所示。

圖2-2 多列索引

主站蜘蛛池模板: 革吉县| 颍上县| 玛多县| 城固县| 白城市| 保山市| 象山县| 彭山县| 青冈县| 临沭县| 九龙坡区| 梨树县| 都昌县| 瑞丽市| 南涧| 科技| 土默特左旗| 台湾省| 东乌珠穆沁旗| 枝江市| 中山市| 靖边县| 平凉市| 长白| 昌平区| 信宜市| 高台县| 百色市| 惠东县| 东至县| 阿荣旗| 黄平县| 金门县| 通河县| 昂仁县| 齐齐哈尔市| 疏勒县| 甘泉县| 若尔盖县| 贵溪市| 含山县|