golang现代文本索引库插件bleve的使用

Golang现代文本索引库插件bleve的使用

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

1 回复

更多关于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)
		}
	}
}

实际应用建议

  1. 批量索引:对于大量文档,使用批量索引提高性能

    batch := index.NewBatch()
    batch.Index(doc1.Id, doc1)
    batch.Index(doc2.Id, doc2)
    index.Batch(batch)
    
  2. 内存索引:对于临时索引,可以使用内存索引

    index, err := bleve.NewMemOnly(bleve.NewIndexMapping())
    
  3. 中文支持:使用cjk分析器或添加中文分词插件

    mapping := bleve.NewIndexMapping()
    err := mapping.AddCustomAnalyzer("cjk", map[string]interface{}{
        "type": "cjk",
    })
    
  4. 索引优化:定期合并索引段

    index, _ := bleve.Open("example.bleve")
    index.ForceMerge()
    

Bleve是一个功能强大且灵活的全文搜索库,适用于各种规模的应用程序。通过合理配置mapping和使用适当的查询类型,可以构建高效的搜索功能。

回到顶部