Indexer - OpenSearch 3

云搜索服务介绍

云搜索服务(Cloud Search)是一个全托管、一站式信息检索与分析平台,提供了 ElasticSearch 和 OpenSearch 引擎,支持全文检索、向量检索、混合搜索及时空检索等多种核心能力。

Eino 的 OpenSearch 3 索引器实现,实现了 Indexer 接口。这使得 OpenSearch 可以无缝集成到 Eino 的向量存储和检索系统中,增强语义搜索能力。

功能特性

  • 实现 github.com/cloudwego/eino/components/indexer.Indexer
  • 易于集成到 Eino 的索引系统
  • 可配置的 OpenSearch 参数
  • 支持向量相似度搜索
  • 支持批量索引操作
  • 支持自定义字段映射
  • 灵活的文档向量化支持

安装

go get github.com/cloudwego/eino-ext/components/indexer/opensearch3@latest

快速开始

以下是一个如何使用该索引器的简单示例,更多细节可参考 components/indexer/opensearch3/examples/indexer/main.go:

package main

import (
        "context"
        "fmt"
        "log"
        
        "github.com/cloudwego/eino/schema"
        opensearch "github.com/opensearch-project/opensearch-go/v4"
        "github.com/opensearch-project/opensearch-go/v4/opensearchapi"

        "github.com/cloudwego/eino-ext/components/indexer/opensearch3"
)

func main() {
        ctx := context.Background()

        client, err := opensearchapi.NewClient(opensearchapi.Config{
                Client: opensearch.Config{
                        Addresses: []string{"http://localhost:9200"},
                        Username:  username,
                        Password:  password,
                },
        })
        if err != nil {
                log.Fatal(err)
        }

        // 创建 embedding 组件
        emb := createYourEmbedding()

        // 创建 opensearch indexer 组件
        indexer, _ := opensearch3.NewIndexer(ctx, &opensearch3.IndexerConfig{
                Client:    client,
                Index:     "your_index_name",
                BatchSize: 10,
                DocumentToFields: func(ctx context.Context, doc *schema.Document) (map[string]opensearch3.FieldValue, error) {
                        return map[string]opensearch3.FieldValue{
                                "content": {
                                        Value:    doc.Content,
                                        EmbedKey: "content_vector",
                                },
                        }, nil
                },
                Embedding: emb,
        })

        docs := []*schema.Document{
                {ID: "1", Content: "example content"},
        }

        ids, _ := indexer.Store(ctx, docs)
        fmt.Println(ids)
}

配置说明

可以通过 IndexerConfig 结构体配置索引器:

type IndexerConfig struct {
    Client *opensearchapi.Client // 必填:OpenSearch 客户端实例
    Index  string             // 必填:用于存储文档的索引名称
    BatchSize int             // 选填:最大文本嵌入批次大小(默认:5)

    // 必填:将 Document 字段映射到 OpenSearch 字段的函数
    DocumentToFields func(ctx context.Context, doc *schema.Document) (map[string]FieldValue, error)

    // 选填:仅当需要向量化时必填
    Embedding embedding.Embedder
}

// FieldValue 定义字段应如何存储和向量化
type FieldValue struct {
    Value     any    // 存储的原始值
    EmbedKey  string // 如果设置,Value 将被向量化并保存及其向量值
    Stringify func(val any) (string, error) // 选填:自定义字符串转换函数
}

获取帮助

如果有任何问题 或者任何功能建议,欢迎进这个群 oncall。


最后修改 January 20, 2026: feat(eino): update zh docs (0a8d3895f9)