三种基于 Elasticsearch 的向量搜索的建议
in Note with 0 comment
三种基于 Elasticsearch 的向量搜索的建议
in Note with 0 comment

背景

我们做了三种方案的测试分别是:

第三方对不同插件的概述:

2022-02-24T09:34:37.png

结论

10并发+持续10秒的场合下,可以得到下面的结论

  1. 我们可以看到 LSH 的召回率是三者中最低的,只有85%,基本上可以放弃这种算法在业务上的应用,LVSPQ 插件开源社区基本上不维护了,也不考虑了;
  2. es+ elastiknn 的方式,exact 平均耗时10ms,耗时低,插件自身有做针对向量的优化,可以应用在业务上;
  3. es+原生实现,exact 平均耗时70ms,能用,对耗时不敏感的业务友好,es 7.14.1 为什么不做插件那种对向量的优化? 因为现在 7.14.1 的版本依赖的 Lucene 是 8.9.0,向量的优化工作是落到了 Lucene,这个版本的 Lucene 对向量搜索支持还不够好,但是根据 Lucene 9 的开发记录,会针对向量做更好的支持,假如升级到 9 后,exact 应该是能做到跟插件的一样的耗时,然后 es 8.0 也会有原生对 hnsw 的支持,es 8+ 这个未来的版本是一个对向量搜索的支持更友好,相关功能更多的版本;
  4. opensearch knn 的方案是最接近阿里云和百度云的,对比各自的文档的内容,有理由相信阿里和百度他们实现是有借鉴 os knn 的代码,所以我认为 os knn 就是等于阿里云或百度云的方案,因为 os 是基于 es 的 7.10.2,Lucene 也是 8.9.0,它的 exact 耗时跟 es 7.14 的略差,平均耗时90ms;
  5. opensearch knn hnsw 方案,非常出色,在100w+256维的数据量下,平均耗时能做到10ms,根据第三方做的召回率的测试,有95%+,在大数据量,耗时敏感,准确敏感的业务上,hnsw是最好的方案,缺点也明显的,非常吃内存。

结合我们的业务场景,相似度搜索的有当天库,历史库和固定库,无论是哪种库,数据量都是相对少,在0~10w之间。

建议

1、现阶段,推荐使用 elasticsearch 7.14.1 + elastiknn 7.14.1.2 + exact 的方案;
2、elasticsearch 8+ 版本的使用可以当成后续升级迭代相关业务服务的一个优化点;
3、不考虑 opensearch,原因是社区维护落后,相对消极。

下面是 Elasticsearhc 8.0 关于 knn 支持部分
2022-02-24T09:38:47.png

链接

一些辅助理解的链接:

Responses