自己動手寫搜尋引擎

2022-05-03 03:00:06 字數 2413 閱讀 8403

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是我們比較常用的一種資料庫軟體。它有著諸多的優點,如開源的,免費的等等。其實它還有乙個很好的特點,那就是有多種引擎可以供你選擇。如果賽車手能根據不同的路況,地形隨手更換與之最適宜的引擎,那麼他們將創造奇蹟。然而目前他們還做不到那樣便捷的更換引擎,但是我們卻可以 所謂知己知彼方可百戰不殆,要...

實現自己的搜尋引擎(一)

搜尋引擎的原理其實很簡單,寫出來沒兩頁紙,但是實現中的各種細節寫成的 可以堆滿兩個圖書館。讓我們先從原理說起。首先需要用輸入資料建立索引,對於網際網路搜尋引擎,輸入資料是乙個個由爬蟲從網上抓回來的網頁,經過清洗之後進行內容抽取,然後整理成統一的格式交給索引程式建立索引。索引由以下幾個基本的組成部分 ...