先把结论说透
群里最常见的问题:
"Easysearch 对 ES 8.x 的向量特性兼容情况怎样?"
答案就一句话:
Easysearch 支持向量搜索,但不兼容 Elasticsearch 8.x 的向量 API。它有自己的一套 API。
很多人一听"不兼容"就慌了——以为 Easysearch 不支持向量搜索。
错了。
两个都支持向量搜索,只是不是同一套接口语言。能力相近 ≠ 接口兼容。
核心差异一张表看完
对比项 | Easysearch | Elasticsearch |
|---|---|---|
向量字段类型 | knn_dense_float_vector/ | dense_vector/ |
查询入口 | query.knn_nearest_neighbors | 顶层 |
查询向量参数名 | vec.values | query_vector |
近似/精确控制 | model: lsh / exact | approximate kNN / |
候选数参数名 | 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.values,model和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