radic 是我用go語言實現搜尋引擎的索引部分,包括:
倒排索引
正排索引
分布式索引
首先需要go get github.com/orisun/radic
package main
import (
"radic/types"
"bytes"
"encoding/gob"
"fmt"
"radic"
"time"
)//book 以圖書搜尋為例
type book struct
//serialize 圖書序列化。序列化和反序列化由呼叫方決定,這不是radic負責的範疇。
func (self *book) serialize() byte else }}
//deserializebook 圖書反序列化
func deserializebook(v byte) *book
err := dec.decode(&data)
if err == nil else
}func main()
engine := radic.indexengine{}
engine.init(options, types.distopts{}, "radic.log") //distopts為空,則採用單機索引
defer engine.destroy()
/**往索引上新增資料
*/book1 := book
book2 := book
kw1 := &types.keyword
kw2 := &types.keyword
kw3 := &types.keyword
kw4 := &types.keyword
kw5 := &types.keyword
docinfo1 := types.docinfo,
rankscore: book1.price,
entry: book1.serialize(),
compositefeature: 1, //轉成二進位制,倒數第1位上是1
} docinfo2 := types.docinfo,
rankscore: book2.price,
entry: book2.serialize(),
compositefeature: 3, //轉成二進位制,倒數第1位和第2位上都是1
} engine.indexdoc(docinfo1) //往索引上新增資料是非同步執行的
engine.indexdoc(docinfo2)
time.sleep(100 * time.millisecond) //稍等一會兒,等add操作執行完成
engine.invertindexstatistics("") //建好索引後最好呼叫一次invertindexstatistics,有利於搜尋速度的提公升
/***/
keyword := &types.keyword
request := types.searchrequest,
should: nil,
not: nil,
outputoffset: 0,
onflag: 1, //要求倒數第1位上是1
offflag: 4, //要求倒數第3位上不能是1
orderless: false,
countdocsonly: false,
timeout: 200,
} response := engine.search(request)
if !response.timeout
} fmt.println()
/**按doc id檢索
*/doc := engine.getdoc(book1.id, 1) //根據id獲取乙個doc的詳情。flag=1僅獲取detail,flag=0都獲取
book := deserializebook(doc.entry)
fmt.printf("book name %s\n", book.name)
fmt.printf("book keywords %v\n", doc.keyword) //由於flag=1,所以獲取不到keyword
fmt.println()
/**刪除doc
*/engine.removedoc(book2.id)
fmt.println()
/**遍歷索引上的資料
*/engine.iterindex(func(docid uint32, docinfo types.docinfo) error )
}
更多api參見radic.go 搜尋引擎 索引
正排索引 文件編號,單詞編號,單詞的數量,單詞出現的位置。倒排索引 1,單詞詞典,儲存單詞以及統計資訊,單詞在記錄表中的便宜,可常駐記憶體,用雜湊表儲存。2,記錄表,單詞對應的文件集合,記錄單詞出現的數目 位置。文件採用差分變長編碼。其中文件可按編號公升序排列 可利用差分編碼 也可按出現次數排列,可...
MySQL搜尋引擎程式 mysql搜尋引擎
mysql是我們比較常用的一種資料庫軟體。它有著諸多的優點,如開源的,免費的等等。其實它還有乙個很好的特點,那就是有多種引擎可以供你選擇。如果賽車手能根據不同的路況,地形隨手更換與之最適宜的引擎,那麼他們將創造奇蹟。然而目前他們還做不到那樣便捷的更換引擎,但是我們卻可以 所謂知己知彼方可百戰不殆,要...
實現自己的搜尋引擎(一)
搜尋引擎的原理其實很簡單,寫出來沒兩頁紙,但是實現中的各種細節寫成的 可以堆滿兩個圖書館。讓我們先從原理說起。首先需要用輸入資料建立索引,對於網際網路搜尋引擎,輸入資料是乙個個由爬蟲從網上抓回來的網頁,經過清洗之後進行內容抽取,然後整理成統一的格式交給索引程式建立索引。索引由以下幾個基本的組成部分 ...