全文檢索庫 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
相關文章
- 配置全文檢索
- Kibana 全文檢索操作
- 全文檢索的轉義
- solr全文檢索學習Solr
- 基於ElasticSearch實現商品的全文檢索檢索Elasticsearch
- openGauss每日一練(全文檢索)
- oracle全文索引之配置全文檢索環境Oracle索引
- php + MongoDB + Sphinx 實現全文檢索PHPMongoDB
- Oracle的全文檢索技術(轉)Oracle
- PostgreSQL全文檢索-詞頻統計SQL
- 全文檢索技術lucene的demo
- springboot ElasticSearch 簡單的全文檢索高亮Spring BootElasticsearch
- 【IT老齊072】全文檢索執行原理
- 基於Lucene的全文檢索實踐
- ElasticSearch 實現分詞全文檢索 - 概述Elasticsearch分詞
- IM全文檢索技術專題(四):微信iOS端的最新全文檢索技術優化實踐iOS優化
- 在ef core中使用postgres資料庫的全文檢索功能實戰資料庫
- ElasticSearch 實現分詞全文檢索 - delete-by-queryElasticsearch分詞delete
- 個人部落格分享(Laravel + Vue 元件,支援全文檢索)LaravelVue元件
- Mysql 如何實現全文檢索,關鍵詞跑分MySql
- 在ef core中使用postgres資料庫的全文檢索功能實戰之中文支援資料庫
- lnmp+coreseek實現站內全文檢索(安裝篇)LNMP
- 讀書筆記:從Lucene到Elasticsearch:全文檢索實戰筆記Elasticsearch
- 沒辦法了,用 MySQL 做全文檢索也挺好的MySql
- 【搜尋引擎】Solr全文檢索近實時查詢優化Solr優化
- Homestead 環境下安裝 Elasticsearch 並使用 scout 進行全文檢索Elasticsearch
- 資料庫的檢索語句資料庫
- 【搜尋引擎】Solr Suggester 實現全文檢索功能-分詞和和自動提示Solr分詞
- 學術檢索資料庫總結資料庫
- 時序資料庫的秘密 —— 快速檢索資料庫
- ES:檢索
- pta檢索
- JavaScript 檢視全文和收起JavaScript
- 影象檢索:資訊檢索評價指標mAP指標
- 資料檢索
- 資訊檢索
- CMake連結庫,會檢索庫引用標頭檔案路徑
- 全文檢索引擎(三)---原理剖析索引