「GoCN酷Go推薦」?全文檢索庫bluge
推薦理由
提到全文檢索庫,第一個想到的就是Java實(shí)現(xiàn)的lucene,今天介紹一款Golang實(shí)現(xiàn)的全文檢索庫bluge。bluge脫胎于Bleve,是當(dāng)前Github比較火的搜索引擎項目zinc的底層索引檢索庫。
功能介紹
bluge索引存儲支持內(nèi)存,本地文件,以及擴(kuò)展云存儲等方式,文檔字段類型支持Text, Numeric, Date, Geo Point等。
查詢檢索支持如下特性:
支持多種查詢方式:term/phrase/match等基本的全文檢索,數(shù)字/時間范圍查詢; 聚合函數(shù):Min/Max/Count/Sum/Avg/Weighted Avg; 匹配高亮。
使用指南
安裝
go?get?github.com/blugelabs/bluge
代碼示例
下面是一個簡單的例子:
package?main
import?(
?"context"
?"fmt"
?"log"
?"time"
?"github.com/blugelabs/bluge"
)
func?main()?{
?//?write?index
?writeIndex("./data/bluge/")
?//?batch?insert
?batch("./data/bluge/")
?//?search
?search("./data/bluge/")
}
//?創(chuàng)建索引
func?writeIndex(indexPath?string)?{
?config?:=?bluge.DefaultConfig(indexPath)
?writer,?err?:=?bluge.OpenWriter(config)
?if?err?!=?nil?{
??log.Fatalf("error?opening?writer:?%v",?err)
?}
?defer?writer.Close()
????//?新建文檔
?doc?:=?bluge.NewDocument("example").
??AddField(bluge.NewTextField("name",?"bluge")).AddField(bluge.NewDateTimeField("created_at",?time.Now()))
?err?=?writer.Update(doc.ID(),?doc)
?if?err?!=?nil?{
??log.Fatalf("error?updating?document:?%v",?err)
?}
}
//?批量創(chuàng)建
func?batch(indexPath?string)?{
?writer,?err?:=?bluge.OpenWriter(bluge.DefaultConfig(indexPath))
?batch?:=?bluge.NewBatch()
?for?i?:=?0;?i?10;?i++?{
??doc?:=?bluge.NewDocument(fmt.Sprintf("example_%d",?i)).
???AddField(bluge.NewTextField(fmt.Sprintf("field_%d",?i),?fmt.Sprintf("value_%d",?i%2))).AddField(bluge.NewDateTimeField("created_at",?time.Now()))
??batch.Insert(doc)
?}
?err?=?writer.Batch(batch)
?if?err?!=?nil?{
??log.Fatalf("error?executing?batch:?%v",?err)
?}
?batch.Reset()
}
//?查詢
func?search(indexPath?string)?{
?config?:=?bluge.DefaultConfig(indexPath)
?reader,?err?:=?bluge.OpenReader(config)
?if?err?!=?nil?{
??log.Fatalf("error?getting?index?reader:?%v",?err)
?}
?defer?reader.Close()
?query?:=?bluge.NewMatchQuery("value_1").SetField("field_1")
?request?:=?bluge.NewTopNSearch(10,?query).
??WithStandardAggregations()
?documentMatchIterator,?err?:=?reader.Search(context.Background(),?request)
?if?err?!=?nil?{
??log.Fatalf("error?executing?search:?%v",?err)
?}
?match,?err?:=?documentMatchIterator.Next()
?for?err?==?nil?&&?match?!=?nil?{
??err?=?match.VisitStoredFields(func(field?string,?value?[]byte)?bool?{
???fmt.Printf("match:?%s:%s\n",?field,?string(value))
???return?true
??})
??if?err?!=?nil?{
???log.Fatalf("error?loading?stored?fields:?%v",?err)
??}
??fmt.Println(match)
??match,?err?=?documentMatchIterator.Next()
?}
?if?err?!=?nil?{
??log.Fatalf("error?iterator?document?matches:?%v",?err)
?}
}
總結(jié)
bulge是Golang實(shí)現(xiàn)的全文檢索庫,功能上類似lucene,性能上相比lucene還有些差距,如果對全文檢索感興趣可以把玩把玩。
參考資料
https://github.com/blugelabs/bluge https://blugelabs.com/bluge/
《酷Go推薦》招募:
各位Gopher同學(xué),最近我們社區(qū)打算推出一個類似GoCN每日新聞的新欄目《酷Go推薦》,主要是每周推薦一個庫或者好的項目,然后寫一點(diǎn)這個庫使用方法或者優(yōu)點(diǎn)之類的,這樣可以真正的幫助到大家能夠?qū)W習(xí)到
新的庫,并且知道怎么用。
大概規(guī)則和每日新聞類似,如果報名人多的話每個人一個月輪到一次,歡迎大家報名!戳「閱讀原文」,即可報名
掃碼也可以加入 GoCN 的大家族喲~
評論
圖片
表情
