Milvus 上新!全新 Range Search 功能,可精准控制搜索结果
Range Search 功能诞生于社区。
某天,一位做系统推荐的用户在社区提出了需求,希望 Milvus 能提供一个新功能,可以返回向量距离在一定范围之内的结果。而这不是个例,开发者在做相似性查询时,经常需要对结果做二次过滤。
为了帮助用户解决这一问题,Milvus 推出了全新功能—— Range Search(范围搜索)。本文将带各位详解这一新功能,包括 Range Search 的基本介绍、使用场景及其背后的技术细节。
01.什么是 Range Search?
顾名思义,Range Search 即范围搜索。不同于 KNN Search 返回最相似的 TOP-K 个结果,Range Search 会返回向量距离落于某一区间的 TOP-K 个结果。
那么,何时选择 Range Search 而非 Top-K 搜索?
Range Search 最典型的应用场景就是推荐系统。比如商品推荐,一个好的推荐系统,返回的应该是与用户点击的商品有一定相似度,但又不太相似的结果。太相似或太不相似的推荐都会导致推荐效果不尽如人意。
在有 Range Search 功能之前,做推荐系统的用户只能先执行一次 KNN Search,再在 Milvus 系统之外对查询结果进行二次过滤。如今,有了 Range Search 功能,他们可以直接调用 Range Search,一次性得到所需要的结果。
Range Search 新增了 2 个参数,分别是:
-
radius(半径) - 指相似性的外边界
-
range_filter(范围过滤器) - 指相似性的内边界
02.Range Search 的技术实现细节
接下来,我们深入 Range Search 功能的架构和算法,探讨其优势、局限性以及 Range Search 与第三方算法库集成。
Range Search 重用了现有的搜索流程,二者在上层所有数据通路几乎完全是一样的。以下是接收到搜索请求时所采取的步骤:
-
SDK 接到一个用户的查询请求,在 search param 中包含了 radius 和 range_filter 信息;
-
proxy 在收到这个查询请求后,生成一个 SearchTask 传给 querynode;
-
querynode 在收到 SearchTask 后,通过 cgo 调用 segcore 的 Search 接口;
-
segcore 会解析 search_param 中带的参数,如果有 radius,则调用 knowhere::RangeSearch;
-
knowhere 再根据索引类型调用到对应的第三方库的 range_search 函数。
目前,所有的第三方库索引都只支持单边 Range Search,也就是只接收一个参数 radius,而且返回的结果是全量未排序的结果。下表概述了不同索引类型的 Range Search 策略“
对于 binary 类型的索引,HAMMING 和 JACCARD 全部都支持 Range Search,SUBSTRUCTURE/SUPERSTRUCTURE 由于返回值是 true/false,不满足 Range Search 的语义,所以不支持 Range Search。其余 float 类型索引,对于 L2/IP/COSINE 全部支持 Range Search。
下表是所有支持 Range Search 的索引类型和 metric type:
03.Range Search 使用方法
如需使用 Range Search,只需要修改搜索请求中的搜索参数。接下来我会讲一下的详细使用指南,在指南的最后还提供了 Python 示例代码。
开始前
请确保已安装并运行 Milvus。
请确保已创建 1 个 Collection,并为该 Collection 创建索引。
Range Search 参数
-
radius:必要参数。决定搜索请求将执行 Range Search 还是 KNN Search。
-
range_filter:可选参数。如果设置该参数,函数将对结果进行二次过滤。
通过上述两个参数,我们可以根据不同应用场景和需求微调 Range Search 的行为。以下为示例代码:
default_index = {"index_type": "HNSW","metric_type": "L2","params": {"M":48,"efConstruction":500} } collection.create_index("float_vector", default_index) search_params = {"metric_type": "L2","limit": TOPK, "params": {"ef":32,"range_filter":1.0,"radius":2.0} } res = collection.search(vectors[:nq], "float_vector", search_params, limit)
04.参数检查
下表列出了所有 metric type 对应的 radius 合法值范围:
由于不同 metric type 对应的 radius 合法值范围不同,Milvus 不会检查 radius 的合法性,而是只检查 radius 和 range_filter 的相对合法性:
-
对于 L2/Hamming/Jaccard,range_filter < radius
-
对于 IP/Cosine,range_filter > radius
05.总结
Milvus 的 Range Search 功能不仅限于推荐引擎,还可以广泛应用在内容匹配、异常检测和 NLP 搜索等任务中。通过利用 radius 和 range_filter 两个参数,用户可以精准定制查询,满足不同用例的需求。
Range Search 现已正式登陆 Zilliz Cloud Beta 版!如需体验 Range Search 功能,请将 Zilliz Cloud(https://zilliz.com.cn/cloud) 集群升级至 Beta 版或下载 Milvus 2.3.x(https://milvus.io/docs/install_cluster-milvusoperator.md)。另外,如果大家在使用 Range Search 功能中遇到任何问题或者建议,欢迎向我们反馈!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
万字解析XML配置映射为BeanDefinition的源码
本文分享自华为云社区《Spring高手之路16——解析XML配置映射为BeanDefinition的源码》,作者:砖业洋__。 1. BeanDefinition阶段的分析 Spring框架中控制反转(IOC)容器的BeanDefinition阶段的具体步骤,主要涉及到Bean的定义、加载、解析,并在后面进行编程式注入和后置处理。这个阶段是Spring框架中Bean生命周期的早期阶段之一,对于理解整个Spring框架非常关键。 加载配置文件、配置类 在这一步,Spring容器通过配置文件或配置类来了解需要管理哪些Bean。对于基于XML的配置,通常使用ClassPathXmlApplicationContext或者FileSystemXmlApplicationContext。 解析配置文件、配置类并封装为BeanDefinition Spring框架通过使用BeanDefinitionReader实例(如XmlBeanDefinitionReader)来解析配置文件。解析后,每个Bean配置会被封装成一个BeanDefinition对象,这个对象包含了类名、作用域、生命周期回调等信息...
- 下一篇
指针“爆雷”导致公司损失上亿资金
1990 年 1 月 15 日,AT&T 的新泽西运营中心检测到大范围的系统故障,网络显示屏上出现了大量红色警告。 尽管试图排除故障,但网络故障仍持续了 9 个小时,导致呼叫连接故障率达到 50%。 AT&T 因此损失了 6000 多万美元,6 万多名美国人的电话完全无法接通。 此外,500 个航班延误,8.5 万人受到影响。 按理说,AT&T 的长途网络是高效率的典范,它利用先进的电子交换机和信号系统处理了全国大部分的电话。该系统通常能在几秒钟内完成电话路由选择。 然而,就在这一天,从纽约的一个交换机开始,整个网络出现了故障。这是由于最近一次更新中的一个软件错误造成的,该错误影响了网络中的 114 个交换机。当纽约的交换机复位并发出信号时,这个错误引发了多米诺骨牌效应,导致大范围的网络中断。 有趣的是,这个软件并没有经过测试。由于代码改动较小,因此按照管理层的要求绕过了测试。 问题所在 追根溯源,原因在于网络交换机实施的软件更新中出现了编码错误。 该错误发生在一个 C 语言程序中,涉及嵌套条件语句中一个错位的中断语句,导致数据覆盖和系统重置。 伪代码 1 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 2048小游戏-低调大师作品
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Red5直播服务器,属于Java语言的直播服务器