- 自己動(dòng)手寫(xiě)分布式搜索引擎
- 羅剛
- 601字
- 2020-11-28 15:52:41
第2章 自己動(dòng)手寫(xiě)全文檢索
很多軟件系統(tǒng)都需要對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)。信息檢索中最常用的數(shù)據(jù)結(jié)構(gòu)是倒排索引。全文索引如圖2-1所示。

圖2-1 以詞為基礎(chǔ)的全文索引
倒排索引就是一個(gè)詞到文檔列表的映射。用HashMap實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的倒排索引代碼如下。
public class InvertedIndex { Map<String, List<Tuple>> index = new HashMap<String, List<Tuple>>(); //詞和這個(gè)詞在文檔中出現(xiàn)的位置信息 // 索引文檔 public void indexDoc(String docName, ArrayList<String> words) { int pos = 0; for (String word : words) { pos++; // 位置 List<Tuple> idx = index.get(word); if (idx == null) { idx = new LinkedList<Tuple>(); index.put(word, idx); } idx.add(new Tuple(docName, pos)); System.out.println("indexed " + docName + " : " + pos + " words"); } } // 搜索 public void search(List<String> words) { for (String word : words) { Set<String> answer = new HashSet<String>(); List<Tuple> idx = index.get(word); if (idx ! = null) { for (Tuple t : idx) { //找到了一些文檔 answer.add(t.docName); } } System.out.print(word); for (String f : answer) { System.out.print(" " + f); //輸出文件名 } System.out.println(""); } } private class Tuple { //<文檔名,位置>元組 private String docName; // 文檔名 private int position; // 位置 public Tuple(String d, int position) { this.docName = d; this.position = position; } } }
如果用戶(hù)的查詢(xún)中包含多個(gè)詞,需要統(tǒng)計(jì)這些詞在文檔中出現(xiàn)的區(qū)間大小。區(qū)間越小的文檔相關(guān)度越高。
public class Span { public int start; // 開(kāi)始位置 public int end; // 結(jié)束位置 public Span(int s, int e) { start = s; end = e; } public int length() { return end - start + 1; } public String toString() { return start + "-" + end; } }
建立索引往往很耗時(shí),所以應(yīng)把建立好的倒排索引保存到文件。查詢(xún)之前先讀入建立好的索引。
倒排索引由兩個(gè)文件組成:一是文件存儲(chǔ)倒排列表;另外一個(gè)是B樹(shù)(Btree)存儲(chǔ)詞到倒排列表的映射。
索引的實(shí)現(xiàn)接口如下。
/** 一個(gè)索引應(yīng)該實(shí)現(xiàn)的功能模板 */ public interface Index { /** 使用數(shù)據(jù)庫(kù)統(tǒng)計(jì)類(lèi)構(gòu)建索引 */ public void build(DatabaseStatistics s); /** 從文件加載倒排索引 */ public void read(String filename) throws IOException; /** 把內(nèi)存中建好的倒排索引存入文件 */ public void flush(String filename) throws IOException; }
可以把創(chuàng)建索引和讀入索引的方法分到不同的類(lèi)實(shí)現(xiàn),分別為IndexWriter和IndexReader類(lèi)。
推薦閱讀
- UG NX10.0從新手到高手
- CAXA CAD電子圖板2020工程制圖
- Premiere Pro 2022短視頻剪輯、調(diào)色與特效制作實(shí)戰(zhàn)(全彩微課版)
- Creo Parametric 5.0中文版從入門(mén)到精通
- 影視動(dòng)畫(huà)場(chǎng)景與特效制作:3ds Max-Vue-AfterBurn-FumeFX
- 無(wú)師自通AutoCAD:中文版室內(nèi)設(shè)計(jì)
- 計(jì)算機(jī)圖形圖像處理Photoshop CS6項(xiàng)目教程
- 快學(xué)熟用D3
- Oracle Enterprise Manager Grid Control 11g R1: Business Service Management
- 學(xué)摳圖:Photoshop專(zhuān)業(yè)摳圖技法案例教程
- Elasticsearch數(shù)據(jù)搜索與分析實(shí)戰(zhàn)
- Photoshop手繪從新手到高手
- After Effects 2023實(shí)訓(xùn)教程
- 手把手教你學(xué)成PPT高手
- 玩轉(zhuǎn)國(guó)潮:Procreate插畫(huà)創(chuàng)作及實(shí)例教程