先把结论说透

群里最常见的问题:

"Easysearch 对 ES 8.x 的向量特性兼容情况怎样?"

答案就一句话:

Easysearch 支持向量搜索,但不兼容 Elasticsearch 8.x 的向量 API。它有自己的一套 API。

很多人一听"不兼容"就慌了——以为 Easysearch 不支持向量搜索。

错了。

两个都支持向量搜索,只是不是同一套接口语言。能力相近 ≠ 接口兼容。

核心差异一张表看完

对比项

Easysearch

Elasticsearch

向量字段类型

knn_dense_float_vector

 / knn_sparse_bool_vector

dense_vector

 / sparse_vector / semantic_text

查询入口

query.knn_nearest_neighbors

顶层 knn / retriever.knn / script_score

查询向量参数名

vec.values query_vector

近似/精确控制

model: lsh / exact

approximate kNN / script_score

候选数参数名

candidates num_candidates

与 ES 8.x 兼容

❌ 不兼容向量相关 API

✅ 官方原生

记住这两行就够了:字段类型不同,查询 DSL 入口不同。一边的 JSON 原样发到另一边,必报错。


直接看 DSL,一眼看出差别

Easysearch 写法

建索引:

https://docs.infinilabs.com/easysearch/main/docs/features/vector-search/

PUT /my-vectors
{
"mappings": {
    "properties": {
      "embedding": {
        "type": "knn_dense_float_vector",
        "knn": {
          "dims": 4,
          "model": "lsh",
          "similarity": "cosine",
          "L": 99,
          "k": 1
        }
      }
    }
  }
}

查询:

POST /my-vectors/_search
{
  "size": 10,
  "query": {
    "knn_nearest_neighbors": {
      "field": "embedding",
      "vec": { "values": [0.10, -0.02, 0.87, 0.40] },
      "model": "lsh",
      "similarity": "cosine",
      "candidates": 100
    }
  }
}

关键点:查询入口是 knn_nearest_neighbors,向量放 vec.valuesmodel 和 similarity 都要显式写。

Easysearch 向量检索之从原理到实战

将斯坦福 GloVe 词向量数据集索引到 Easysearch 以实现语义搜索


Elasticsearch 写法

建索引:

PUT /amazon-reviews
{
  "mappings": {
    "properties": {
      "review_vector": {
        "type": "dense_vector",
        "dims": 4,
        "index": true,
        "similarity": "cosine"
      }
    }
  }
}

查询:

POST /amazon-reviews/_search
{
  "knn": {
    "field": "review_vector",
    "query_vector": [0.1, 0.2, 0.29, 0.41],
    "k": 2,
    "num_candidates": 5
  }
}

关键点:查询入口是顶层 knn,向量参数名是 query_vector,返回条数用 k,候选数用 num_candidates

Elasticsearch 8.X 如何利用嵌入向量提升搜索能力?

Elasticsearch 8.X 向量检索和普通检索能否实现组合检索?如何实现?


核心差异对比(精简版)

Easysearch:
"query": { "knn_nearest_neighbors": { "vec": {"values": [...]}, "candidates": 100 } }

Elasticsearch:
"knn": { "query_vector": [...], "k": 10, "num_candidates": 100 }

这不是改几个参数名的问题,是查询结构树完全不同


精确搜索也不一样

Easysearch 精确搜索model 改成 exact,入口不变:

{
  "query": {
    "knn_nearest_neighbors": {
      "field": "my_vec",
      "vec": { "values": [0.1, 0.2, 0.3, 0.4] },
      "model": "exact",
      "similarity": "cosine"
    }
  }
}

Elasticsearch 精确搜索:走 script_score,完全换了套路:

{
  "query": {
    "script_score": {
      "query": { "match_all": {} },
      "script": {
        "source": "cosineSimilarity(params.queryVector, 'product-vector') + 1.0",
        "params": { "queryVector": [0.1, 0.2, 0.3, 0.4] }
      }
    }
  }
}

概念可类比,代码不能照抄。


迁移最容易踩的 4 个坑

坑 1:把 dense_vector 直接搬到 Easysearch

Easysearch 字段类型是 knn_dense_float_vector,不是 dense_vector,直接报错。

坑 2:把 ES 顶层 knn 查询发给 Easysearch

结构不兼容,不是改参数名,是整个查询树不同。

坑 3:把"功能兼容"当成"接口兼容""

都能向量搜索" ≠ "DSL 一样"。决定你能不能迁移的,是映射语法和查询结构,不是功能名词。

坑 4:没跑通最小 Demo 就研究性能调优先用 

4 维假数据把"建索引→写数据→查相似"跑通,再谈召回率和混合检索。


选型建议,两句话说清

已深度依赖 ES 8.x 向量生态(dense_vector、knn、semantic_text):迁移到 Easysearch 不是换个地址,是一次向量层 DSL 重写,提前做好评估。

从零开始、愿意按文档来

Easysearch 文档对字段、模型、查询路径讲得很直接,完全可以上手,照着官方文档走不会踩坑。

https://docs.infinilabs.com/easysearch/main/docs/features/vector-search/


一句话总结

选定体系,遵循它的官方文档,按它的字段定义和查询语法实现。别幻想复用原 DSL。

两边各司其职,都能做向量搜索,只是说的不是同一种语言。认清这一点,少走一半弯路。


参考链接

  • Easysearch 向量搜索:https://docs.infinilabs.com/easysearch/main/docs/features/vector-search/

  • Easysearch kNN API:https://docs.infinilabs.com/easysearch/main/docs/features/vector-search/knn_api/

  • Elasticsearch 向量搜索:https://www.elastic.co/docs/solutions/search/vector

  • Elasticsearch kNN 搜索:https://www.elastic.co/docs/solutions/search/vector/knn

Easysearch 接上 Kibana,就这两步,搞定!

古法工具,依然受用——Cerebro + Easysearch 避坑指南

Easysearch——Elasticsearch 国产化替代方案!

Elasticsearch 国产化替代 ——信创政策到技术选型的全面指南调研报告 V1.0

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐