【Elasticsearch】在Amazon Elasticsearch Service中找不到存储分布式表示向量的字段类型”密集向量(dense_vector)”,这让人困扰
首先
由于可能会变得有点冗长,所以我直接给出结论:我们决定使用亚马逊 Elasticsearch 服务提供的字段类型“knn_vector”来替代存储分散表示向量的字段类型“dense_vector”,以解决我们的问题。
困境
使用Elasticsearch 7.3版本所添加的高维向量文档评分功能,对一篇文章进行了机器学习,实现了”文本相似性搜索”。
一开始,我们使用Elasticsearch(以下简称为Elasticsearch)在本地环境中进行机器学习,然后不久之后需要将训练好的数据迁移到Amazon Elasticsearch Service(以下简称为Amazon ES)。在此过程中,发生了错误,导致后续工作中断。
※文字相似度搜索(或称相似文档搜索)是一项自然语言处理技术,将文本转化为数字表示,并通过这些数字的相似度来选择与搜索条件相近的文本。
导致、诱因、缘故、起因、理由、因由、原由
错误的原因很简单。我们试图使用不存在的字段类型,结果导致了错误。在Elasticsearch中存储分布式表示的向量时,我们使用了字段类型”dense_vector”,但是在Amazon ES中并不存在这个字段类型。
处理方法 fǎ)
我在阅读Amazon ES文档时搜索是否有什么解决方案时,发现有一种名为“KNN”的算法,它作为字段类型“knn_vector”提供。我查阅了Amazon ES开发者指南,发现了这个信息。
在亚马逊 Elasticsearch 服务中,可以使用与k-近邻算法相关的KNN算法来在向量空间中搜索点,并通过欧几里得距离或余弦相似度找到这些点的“最近邻”。这可以用于推荐(例如音乐应用中的“为您推荐的歌曲”功能)、图像识别和欺诈检测等用例。
在日语页面上写着(以原文为准)。这似乎是一种类似于“dense_vector”的字段类型,可以存储高维向量。
只是试着在Amazon ES上定义了字段类型为“knn_vector”的字段,并成功地将存储在“dense_vector”中的向量数据导入,没有出现任何错误。
搜索查询的差异 de
由于字段类型不同,搜索查询也会发生变化。
1.Elasticsearch中的「dense_vector」
"query": {
"script_score": {
"query": {"match_all": {}},
"script": {
"source": "cosineSimilarity(params.query_vector, doc['text_vector']) + 1.0",
"params": {"query_vector": target_vector}
}
}
}
2.亚马逊ES的“knn_vector”
"query": {
"knn": {
"text_vector": {
"vector": target_vector,
"k": 100
}
}
}
搜索结果的差异
由于算法的不同,自然会导致搜索结果的差异。
这次我们以”能获得类似的结果”作为验证的结束。
将来我打算调查关于搜索结果的差异。
请参考以下网站
亚马逊 Elasticsearch 服务> 开发者指南> KNN
尝试使用亚马逊 Elasticsearch 服务的K-NN功能
利用向量场进行文本相似性搜索
使用Elasticsearch进行基于分布式表示的相似文档搜索