Retriever - Elasticsearch 7

云搜索服务介绍

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

Eino 的 Elasticsearch 7.x 检索器实现,实现了 Retriever 接口。该组件可以与 Eino 的检索系统无缝集成,提供增强的语义搜索能力。

功能特性

  • 实现了 github.com/cloudwego/eino/components/retriever.Retriever
  • 易于集成 Eino 检索系统
  • 可配置 Elasticsearch 参数
  • 多种搜索模式:
    • 精确匹配(文本搜索)
    • 稠密向量相似度(语义搜索)
    • 原始字符串(自定义查询)
  • 支持默认结果解析器及自定义
  • 支持过滤器以进行精细查询

安装

go get github.com/cloudwego/eino-ext/components/retriever/es7@latest

快速开始

以下是一个使用检索器的简单示例:

import (
        "context"
        "fmt"
        "os"

        "github.com/cloudwego/eino/schema"
        elasticsearch "github.com/elastic/go-elasticsearch/v7"

        "github.com/cloudwego/eino-ext/components/embedding/ark"
        "github.com/cloudwego/eino-ext/components/retriever/es7"
        "github.com/cloudwego/eino-ext/components/retriever/es7/search_mode"
)

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

        // 连接到 Elasticsearch
        username := os.Getenv("ES_USERNAME")
        password := os.Getenv("ES_PASSWORD")

        client, _ := elasticsearch.NewClient(elasticsearch.Config{
                Addresses: []string{"http://localhost:9200"},
                Username:  username,
                Password:  password,
        })

        // 使用 Volcengine ARK 创建用于向量搜索的 embedding 组件
        emb, _ := ark.NewEmbedder(ctx, &ark.EmbeddingConfig{
                APIKey: os.Getenv("ARK_API_KEY"),
                Region: os.Getenv("ARK_REGION"),
                Model:  os.Getenv("ARK_MODEL"),
        })

        // 创建带有稠密向量相似度搜索的检索器
        retriever, _ := es7.NewRetriever(ctx, &es7.RetrieverConfig{
                Client:     client,
                Index:      "my_index",
                TopK:       10,
                SearchMode: search_mode.DenseVectorSimilarity(search_mode.DenseVectorSimilarityTypeCosineSimilarity, "content_vector"),
                Embedding:  emb,
        })

        // 检索文档
        docs, _ := retriever.Retrieve(ctx, "search query")

        for _, doc := range docs {
                fmt.Printf("ID: %s, Content: %s, Score: %v\n", doc.ID, doc.Content, doc.Score())
        }
}

搜索模式

精确匹配 (Exact Match)

使用 Elasticsearch match 查询进行简单的文本搜索:

searchMode := search_mode.ExactMatch("content")

稠密向量相似度 (Dense Vector Similarity)

使用带有稠密向量的 script_score 进行语义搜索:

// 余弦相似度
searchMode := search_mode.DenseVectorSimilarity(
    search_mode.DenseVectorSimilarityTypeCosineSimilarity,
    "content_vector",
)

// 其他相似度类型:
// - DenseVectorSimilarityTypeDotProduct
// - DenseVectorSimilarityTypeL1Norm
// - DenseVectorSimilarityTypeL2Norm

原始字符串请求 (Raw String Request)

直接传递自定义 JSON 查询:

searchMode := search_mode.RawStringRequest()

// 然后使用 JSON 查询字符串作为搜索查询
query := `{"query": {"bool": {"must": [{"match": {"content": "search term"}}]}}}`
docs, _ := retriever.Retrieve(ctx, query)

配置

type RetrieverConfig struct {
    Client         *elasticsearch.Client  // 必填:Elasticsearch 客户端
    Index          string                 // 必填:索引名称
    TopK           int                    // 选填:结果数量(默认:10)
    ScoreThreshold *float64               // 选填:最低分数阈值
    SearchMode     SearchMode             // 必填:搜索策略
    ResultParser   func(ctx context.Context, hit map[string]interface{}) (*schema.Document, error) // 选填:自定义解析器
    Embedding      embedding.Embedder     // 向量搜索模式必填
}

使用过滤器

使用 WithFilters 选项添加查询过滤器:

filters := []interface{}{
    map[string]interface{}{
        "term": map[string]interface{}{
            "category": "news",
        },
    },
}

docs, _ := retriever.Retrieve(ctx, "query", es7.WithFilters(filters))

获取帮助

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


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