全文檢索庫 bluge
全文檢索庫 bluge
推薦理由
提到全文檢索庫,第一個想到的就是 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 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/")
}
// 建立索引
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 := 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)
}
}
總結
bulge 是 Golang 實現的全文檢索庫,功能上類似 lucene,效能上相比 lucene 還有些差距,如果對全文檢索感興趣可以把玩把玩。
參考資料
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- Oracle全文檢索Oracle
- Kibana 全文檢索操作
- solr全文檢索學習Solr
- Oracle全文檢索之中文Oracle
- 基於ElasticSearch實現商品的全文檢索檢索Elasticsearch
- elasticsearch的實現全文檢索Elasticsearch
- Oracle全文檢索之Ctxcat 索引Oracle索引
- Oracle全文檢索之ContextOracleContext
- 請問全文檢索的思路?
- oracle全文索引之配置全文檢索環境Oracle索引
- Oracle的全文檢索技術(轉)Oracle
- php + MongoDB + Sphinx 實現全文檢索PHPMongoDB
- 全文檢索技術lucene的demo
- 全文檢索的基本原理
- PostgreSQL全文檢索-詞頻統計SQL
- coreseek,php,mysql全文檢索部署(一)PHPMySql
- coreseek,php,mysql全文檢索部署(二)PHPMySql
- 手工建立oracle text全文檢索元件Oracle元件
- openGauss每日一練(全文檢索)
- 基於Lucene的全文檢索實踐
- ElasticSearch 實現分詞全文檢索 - 概述Elasticsearch分詞
- 全文字檢索的應用(2)(轉)
- 全文字檢索的應用(1)(轉)
- jdbm開原始檔資料庫在全文檢索中的使用資料庫
- IM全文檢索技術專題(四):微信iOS端的最新全文檢索技術優化實踐iOS優化
- PHP+redis實現超迷你全文檢索PHPRedis
- Linux Sphinx/Coreseek安裝 Mysql全文檢索LinuxMySql
- Lucene可以對MYSQL進行全文檢索嗎?MySql
- 【IT老齊072】全文檢索執行原理
- 在ef core中使用postgres資料庫的全文檢索功能實戰資料庫
- springboot ElasticSearch 簡單的全文檢索高亮Spring BootElasticsearch
- ElasticSearch 實現分詞全文檢索 - delete-by-queryElasticsearch分詞delete
- RDSforMySQL全文檢索相關問題的處理ORMMySql
- Mysql 如何實現全文檢索,關鍵詞跑分MySql
- 個人部落格分享(Laravel + Vue 元件,支援全文檢索)LaravelVue元件
- 板橋大人,首頁的google全文檢索如何實現Go
- 全文檢索以及一些零散學習
- 讀書筆記:從Lucene到Elasticsearch:全文檢索實戰筆記Elasticsearch