golang现代文本索引库插件bleve的使用
Golang现代文本索引库插件bleve的使用
Bleve是一个用Go编写的现代索引+搜索库。
主要特性
- 可以索引任何Go数据结构或JSON
- 智能默认配置支持强大的功能(scorch)
- 支持的字段类型:
text
,number
,datetime
,boolean
,geopoint
,geoshape
,IP
,vector
- 支持的查询类型:
term
,phrase
,match
,match_phrase
,prefix
,regexp
,wildcard
,fuzzy
- 术语范围、数字范围、日期范围、布尔字段
- 复合查询:
conjuncts
,disjuncts
, 布尔(must
/should
/must_not
) - 查询字符串语法
- 地理空间搜索
- 通过向量搜索实现近似k近邻
- 同义词搜索
- 评分模型:tf-idf / bm25
- 混合搜索:精确+语义
- 查询时间提升
- 搜索结果匹配高亮显示文档片段
- 聚合/分面支持:
- 术语分面
- 数字范围分面
- 日期范围分面
索引示例
// 定义要索引的数据结构
message := struct {
Id string
From string
Body string
}{
Id: "example",
From: "xyz@couchbase.com",
Body: "bleve indexing is easy",
}
// 创建索引映射
mapping := bleve.NewIndexMapping()
// 创建新索引
index, err := bleve.New("example.bleve", mapping)
if err != nil {
panic(err)
}
// 索引文档
index.Index(message.Id, message)
查询示例
// 打开已存在的索引
index, _ := bleve.Open("example.bleve")
// 创建查询
query := bleve.NewQueryStringQuery("bleve")
// 创建搜索请求
searchRequest := bleve.NewSearchRequest(query)
// 执行搜索
searchResult, _ := index.Search(searchRequest)
命令行工具
要安装最新版本的bleve CLI工具,运行:
go install github.com/blevesearch/bleve/v2/cmd/bleve@latest
命令行工具功能包括:
- 批量加载JSON文件
- 检查索引内容
- 计算索引中的文档数量
- 创建新索引
- 打印索引中指定字段的术语字典
- 转储索引内容
- 列出索引中的字段
- 查询索引
- 打印索引使用的映射
- 列出编译到可执行文件中的bleve组件
- 与scorch索引交互
文本分析
Bleve包含通用分析器(可自定义)以及以下语言的预构建文本分析器:
阿拉伯语(ar)、保加利亚语(bg)、加泰罗尼亚语(ca)、中日韩语(cjk)、库尔德语(ckb)、丹麦语(da)、德语(de)、希腊语(el)、英语(en)、西班牙语-卡斯蒂利亚语(es)、巴斯克语(eu)、波斯语(fa)、芬兰语(fi)、法语(fr)、盖尔语(ga)、西班牙语-加利西亚语(gl)、印地语(hi)、克罗地亚语(hr)、匈牙利语(hu)、亚美尼亚语(hy)、印尼语(id, in)、意大利语(it)、荷兰语(nl)、挪威语(no)、波兰语(pl)、葡萄牙语(pt)、罗马尼亚语(ro)、俄语(ru)、瑞典语(sv)、土耳其语(tr)
许可证
Apache License Version 2.0
更多关于golang现代文本索引库插件bleve的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang现代文本索引库插件bleve的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Bleve - Golang现代文本索引库使用指南
Bleve是一个用Go编写的全文搜索和索引库,它提供了强大的文本索引和搜索功能。下面我将介绍Bleve的基本用法和示例代码。
基本概念
Bleve的核心概念包括:
- Index:存储和检索文档的数据结构
- Document:被索引的基本单位,包含多个字段
- Mapping:定义文档如何被分析和索引的规则
安装Bleve
go get github.com/blevesearch/bleve/v2
基本使用示例
1. 创建索引
package main
import (
"fmt"
"log"
"github.com/blevesearch/bleve/v2"
)
func main() {
// 创建或打开索引
index, err := bleve.New("example.bleve", bleve.NewIndexMapping())
if err != nil {
log.Fatal(err)
}
defer index.Close()
// 索引文档
doc1 := struct {
Id string
Title string
Body string
}{
Id: "1",
Title: "Go语言编程",
Body: "Go是一种开源的编程语言,由Google开发。",
}
err = index.Index(doc1.Id, doc1)
if err != nil {
log.Fatal(err)
}
// 搜索
query := bleve.NewMatchQuery("Go语言")
search := bleve.NewSearchRequest(query)
searchResults, err := index.Search(search)
if err != nil {
log.Fatal(err)
}
fmt.Println("搜索结果:")
fmt.Printf("共找到 %d 条结果\n", searchResults.Total)
for _, hit := range searchResults.Hits {
fmt.Printf("ID: %s, 分数: %f\n", hit.ID, hit.Score)
}
}
2. 自定义Mapping
func createCustomMapping() {
// 创建自定义mapping
mapping := bleve.NewIndexMapping()
// 创建文档mapping
docMapping := bleve.NewDocumentMapping()
// 为title字段添加自定义analyzer
titleFieldMapping := bleve.NewTextFieldMapping()
titleFieldMapping.Analyzer = "cjk" // 使用中日韩分析器
docMapping.AddFieldMappingsAt("Title", titleFieldMapping)
// 为body字段使用标准分析器
bodyFieldMapping := bleve.NewTextFieldMapping()
bodyFieldMapping.Analyzer = "standard"
docMapping.AddFieldMappingsAt("Body", bodyFieldMapping)
// 将文档mapping添加到索引mapping
mapping.AddDocumentMapping("doc", docMapping)
// 创建索引
index, err := bleve.New("custom.bleve", mapping)
if err != nil {
log.Fatal(err)
}
defer index.Close()
// 使用自定义mapping索引文档...
}
3. 高级搜索功能
func advancedSearch(index bleve.Index) {
// 布尔查询
boolQuery := bleve.NewBooleanQuery()
boolQuery.AddMust(bleve.NewMatchQuery("编程"))
boolQuery.AddMustNot(bleve.NewMatchQuery("Java"))
// 短语查询
phraseQuery := bleve.NewPhraseQuery([]string{"Google", "开发"}, "Body")
// 组合查询
disjunctionQuery := bleve.NewDisjunctionQuery(boolQuery, phraseQuery)
// 分页搜索
searchRequest := bleve.NewSearchRequest(disjunctionQuery)
searchRequest.Size = 10 // 每页10条
searchRequest.From = 0 // 从第0条开始
searchRequest.Fields = []string{"Title", "Body"} // 返回的字段
searchRequest.Highlight = bleve.NewHighlight() // 高亮匹配内容
searchResults, err := index.Search(searchRequest)
if err != nil {
log.Fatal(err)
}
// 处理结果...
}
4. 聚合查询
func aggregationSearch(index bleve.Index) {
// 创建terms聚合
termsAgg := bleve.NewTermsAggregation()
termsAgg.Field = "Title" // 按Title字段聚合
searchRequest := bleve.NewSearchRequest(bleve.NewMatchAllQuery())
searchRequest.AddAggregation("title_terms", termsAgg)
searchResults, err := index.Search(searchRequest)
if err != nil {
log.Fatal(err)
}
// 获取聚合结果
agg, found := searchResults.Aggregations.Terms("title_terms")
if found {
for _, bucket := range agg.Buckets {
fmt.Printf("Key: %s, Count: %d\n", bucket.Key, bucket.Count)
}
}
}
实际应用建议
-
批量索引:对于大量文档,使用批量索引提高性能
batch := index.NewBatch() batch.Index(doc1.Id, doc1) batch.Index(doc2.Id, doc2) index.Batch(batch)
-
内存索引:对于临时索引,可以使用内存索引
index, err := bleve.NewMemOnly(bleve.NewIndexMapping())
-
中文支持:使用cjk分析器或添加中文分词插件
mapping := bleve.NewIndexMapping() err := mapping.AddCustomAnalyzer("cjk", map[string]interface{}{ "type": "cjk", })
-
索引优化:定期合并索引段
index, _ := bleve.Open("example.bleve") index.ForceMerge()
Bleve是一个功能强大且灵活的全文搜索库,适用于各种规模的应用程序。通过合理配置mapping和使用适当的查询类型,可以构建高效的搜索功能。