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和使用适当的查询类型,可以构建高效的搜索功能。
        
      
                    
                    
                    
