Elasticsearch向量搜索本文将介绍Elasticsearch向量搜索的两种方式。矢量搜索说到矢量搜索,我想你一定很疑惑:什么是矢量搜索?矢量搜索的应用场景有哪些?矢量搜索与全文搜索有何不同?简而言之,ES的全文搜索就是将文本分成词,然后通过BM25算法根据词计算相关度得分,从而找到与搜索语句相似的文本,本质上是一个term基于(基于单词)的搜索。全文检索的实际应用已经非常广泛,核心技术也非常成熟。但是,除了文字内容,现实生活中还有很多其他的数据形式,比如图片、音频、视频等,我们是不是也可以搜索这些数据呢?答案是肯定的!随着机器学习、人工智能等技术的发展,万物皆可嵌入。也就是说,我们可以通过Embedding相关技术,将文本、图片、音频、视频等所有数据转化为特征向量。一旦有了向量,向量搜索的需求就会变得更强烈。矢量搜索的应用场景也变得层出不穷,充满想象。ES向量搜索解释ES向量搜索目前有两种方法:script_score_knn_searchscript_score精确搜索ES7.6版本确认了对新的字段类型dense_vector的稳定性保证,用于表示向量数据。数据建模示例:PUTmy-index{"mappings":{"properties":{"my_vector":{"type":"dense_vector","dims":128},"my_text":{"type":"keyword"}}}}如上图所示,我们在索引中创建了一个dims维度为128的向量数据域。script_score搜索示例:{"script_score":{"query":{"match_all":{}},"script":{"source":"cosineSimilarity(params.query_vector,'my_vector')+1.0","params":{"query_vector":query_vector}}}}上图表示的意思是利用ES7.3之后内置的cosineSimilarity余弦相似度函数来计算向量之间的相似度得分。需要注意的是,script_score的搜索方式是先执行query,然后对匹配到的文档计算向量相似度得分。其隐含的意思是:向量域可以和其他的一起使用支持混合查询(先全文搜索,再根据搜索结果进行向量搜索)。script_score是一个暴力计算,数据集越大,性能损失越大。_knn_search搜索由于script_score的性能问题,ES在8.0版本引入了新的向量搜索方式_knn_search(目前处于实验功能)。所谓_knn_search其实就是approximatenearestneighborsearch(ANN),也就是近似最近邻搜索。这种搜索方法优先考虑搜索性能,同时牺牲了一定的准确性。为了使用_knn_search进行搜索,在对数据建模时有所不同。示例:PUTmy-index-knn{“mappings”:{“properties”:{“my_vector”:{“type”:“dense_vector”,“dims”:128,“index”:true,“similarity”:“dot_product"}}}}如上所示,我们必须额外指定:index为真。similarity指定向量相似度算法,可以是l2_norm、dot_product、cosine中的一种。额外指定index为true是因为ES为了实现_knn_search,必须在底层构建一个新的数据结构(目前使用的是HNSWgraph)。_knn_search搜索示例:GETmy-index-knn/_knn_search{"knn":{"field":"my_vector","query_vector":[0.3,0.1,1.2,...],"k":10,"num_candidates":100},"_source":["name","date"]}使用_knn_search搜索的优点是搜索速度很快,缺点是准确率不是100%,不能与QueryDSL一起使用,即不能做混合搜索。参考文档text-similarity-search-with-vectors-in-elasticsearchdense-vectorknn-searchintroducing-approximate-nearest-neighbor-search-in-elasticsearch
