推荐理由
提到全文检索库,第一个想到的就是Java实现的lucene,今天介绍一款Golang实现的全文检索库bluge。bluge脱胎于Bleve,是当前Github比较火的搜索引擎项目zinc的底层索引检索库。
功能介绍
bluge索引存储支持内存,本地文件,以及扩展云存储等方式,文档字段类型支持Text, Numeric, Date, Geo Point等。
查询检索支持如下特性:
支持多种查询方式:term/phrase/match等基本的全文检索,数字/时间范围查询;
聚合函数:Min/Max/Count/Sum/Avg/Weighted Avg;
匹配高亮。
使用指南
安装
go get github.com/blugelabs/bluge
代码示例
下面是一个简单的例子:
package mainimport ("context""fmt""log""time""github.com/blugelabs/bluge"
)func main() {// write indexwriteIndex("./data/bluge/")// batch insertbatch("./data/bluge/")// searchsearch("./data/bluge/")
}// 创建索引
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)}
}// 批量创建
func batch(indexPath string) {writer, err :&#61; bluge.OpenWriter(bluge.DefaultConfig(indexPath))batch :&#61; bluge.NewBatch()for i :&#61; 0; i < 10; i&#43;&#43; {doc :&#61; 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 &#61; writer.Batch(batch)if err !&#61; nil {log.Fatalf("error executing batch: %v", err)}batch.Reset()
}// 查询
func search(indexPath string) {config :&#61; bluge.DefaultConfig(indexPath)reader, err :&#61; bluge.OpenReader(config)if err !&#61; nil {log.Fatalf("error getting index reader: %v", err)}defer reader.Close()query :&#61; bluge.NewMatchQuery("value_1").SetField("field_1")request :&#61; bluge.NewTopNSearch(10, query).WithStandardAggregations()documentMatchIterator, err :&#61; reader.Search(context.Background(), request)if err !&#61; nil {log.Fatalf("error executing search: %v", err)}match, err :&#61; documentMatchIterator.Next()for err &#61;&#61; nil && match !&#61; nil {err &#61; match.VisitStoredFields(func(field string, value []byte) bool {fmt.Printf("match: %s:%s\n", field, string(value))return true})if err !&#61; nil {log.Fatalf("error loading stored fields: %v", err)}fmt.Println(match)match, err &#61; documentMatchIterator.Next()}if err !&#61; nil {log.Fatalf("error iterator document matches: %v", err)}
}
总结
bulge是Golang实现的全文检索库&#xff0c;功能上类似lucene&#xff0c;性能上相比lucene还有些差距&#xff0c;如果对全文检索感兴趣可以把玩把玩。
参考资料
https://github.com/blugelabs/bluge
https://blugelabs.com/bluge/
《酷Go推荐》招募&#xff1a;
各位Gopher同学&#xff0c;最近我们社区打算推出一个类似GoCN每日新闻的新栏目《酷Go推荐》&#xff0c;主要是每周推荐一个库或者好的项目&#xff0c;然后写一点这个库使用方法或者优点之类的&#xff0c;这样可以真正的帮助到大家能够学习到
新的库&#xff0c;并且知道怎么用。
大概规则和每日新闻类似&#xff0c;如果报名人多的话每个人一个月轮到一次&#xff0c;欢迎大家报名&#xff01;戳「阅读原文」&#xff0c;即可报名
扫码也可以加入 GoCN 的大家族哟&#xff5e;