首页 文章 精选 留言 我的

精选列表

搜索[成本控制],共10000篇文章
优秀的个人博客,低调大师

全新 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 功能中遇到任何问题或者建议,欢迎向我们反馈!

优秀的个人博客,低调大师

Jboot v3.14.0 发布,优化控制器、缓存和事务

Jboot 一个更简单的分布式、微服务框架。 Jboot是一个基于 JFinal、JFinal-Undertow、Dubbo、Seata、Sentinel、ShardingSphere、Nacos 等开发的微服务框架,帮助开发者降低微服务、分布式开发门槛。爽爽开发,快乐生活。 支持 JDK8~JDK17。 Jboot v3.14.0 主要是新增了 Controller 返回值自动匹配渲染器、Controller 缓存(@Cacheable)、@Transactional() 事务注解等的支持,并优化多个细节。 Controller 缓存实例: @Cacheable(name = "aaa", liveSeconds = 10) public void json() { System.out.println("json() invoked!!!!!!!!!"); Map<String, Object> data = new HashMap<>(); data.put("age", 1); data.put("name", "张三"); data.put("sex", 1); renderJson(data); } 以上的代码中,在 10 秒钟内多次访问的时候,只有第一次访问到了 json() 方法,其余的都直接使用第一次的结果输出给浏览器。其中,缓存的名称为 "aaa",key 为class.method()格式。我们可以通过@Cacheable(name = "aaa", key="xxx")来指定缓存的key值。 其中 key 里的内容还可以使用#(方法参数名称)和@para('http参数名称')的方式来定义 key。 例如: @Cacheable(name = "aaa", key="#para('mykey')", liveSeconds = 10) public void json() { System.out.println("json() invoked!!!!!!!!!"); Map<String, Object> data = new HashMap<>(); data.put("age", 1); data.put("name", "张三"); data.put("sex", 1); renderJson(data); } 当访问http://127.0.0.1:8080/json?mykey=thekey的时候,该缓存的 key 的内容为:"thekey"。然而,在某些极端场景下,我们可能是不需要缓存的,配置如下: @Cacheable(name = "aaa", liveSeconds = 10, unless = "para('type')==1") public void json2() { System.out.println("json2() invoked!!!!!!!!!"); Map<String, Object> data = new HashMap<>(); data.put("age", 1); data.put("name", "张三"); data.put("sex", 1); renderJson(data); } 当访问http://127.0.0.1:8080/json2?type=1的时候,永远不会命中缓存。 Controller 返回值制动匹配渲染器实例: @RequestMapping("/") public MyController extends Controller{ //自动使用 html 来渲染 public String test1(){ return "test1.html"; } //自动使用文本来渲染 public String test2(){ return "test2..."; } //渲染 404 错误 public String test3(){ return "error: 404"; } //渲染 500 错误 public String test4(){ return "error: 500"; } //自动 redirect 跳转 public String test5(){ return "redirect: /to/your/path"; } //自动 forward action 重定向 public String test6(){ return "forward: /to/your/path"; } //自动进行文件下载 public File test7(){ return new File('/file/path'); } //渲染 json 内容 public Object test8(){ Map<String,Object> map = new HashMap<>(); map.put("key","value...."); return map; } //使用自动的 render 渲染 public Object test9(){ Render render = new TextRender("some text..."); return render; } } @Transactional 注解实例 实例1:出现异常时回滚 @Transactional public void test1() { //your code throw new RuntimeException("..."); } 实例2:返回值为 false 时回滚 @Transactional(rollbackForFalse=true) public boolean test2() { //your code return false; } 实例3:返回值为 Ret.fail() 时回滚 @Transactional(rollbackForRetFail=true) public Ret test3() { //your code return Ret.fail("message..."); } 实例4:返回值为 null 时回滚 @Transactional(rollbackForNull=true) public Ret test3() { //your code return null; } @Transactional 的更多配置: public @interface Transactional { /** * 使用哪个数据源 * * @return */ String config() default ""; /** * 事务隔离级别 * * @return */ int transactionLevel() default -1; /** * return false 的时候,是否进行回滚 * * @return */ boolean rollbackForFalse() default false; /** * return ret.fail 的时候,是否进行回滚 * * @return */ boolean rollbackForRetFail() default false; /** * 返回 null 的时候,是否进行回滚 * * @return */ boolean rollbackForNull() default false; /** * 配置允许哪些异常不回滚 * * @return */ Class<? extends Throwable>[] noRollbackFor() default {}; /** * 是否在新的线程里执行,在 Controller 的 Action 方法下配置无效 * 在 Controller 里,不能以新的线程在运行 * * @return */ boolean inNewThread() default false; /** * 使用哪个线程池来运行线程,需要在启动的时候,通过 TransactionalManager 来配置线程池及其名称 * * @return */ String threadPoolName() default ""; /** * 是否以阻塞的方式运行线程,这个配置只有在返回值 void 情况下配置生效 * 有返回值的,此配置无效,默认都是阻塞运行线程的方式运行 * * @return */ boolean threadWithBlocked() default false; } 更多细节,请查看 changelist. Jboot v3.14.0 更新内容如下: 新增:@Cacheable() 等系列缓存注解对 controller 的支持 新增:Controller 返回值,自动匹配相应的 render 的支持 新增:分布式任务注解 @EnableDistributedRunnable,自定义的 redisKey 和 key 持有时间配置功能。 新增:AttachmentManager 新增 getFile(path,localFirst) 方法 新增:CookieUtil 添加 "defaultPath" 和 "defaultDomain" 的配置 新增:HttpUtil 添加 http 代理的配置支持 新增:Columns.addToFirst() 方法 新增:JbootDirectiveBase.getParaToString() 新增:MQ 新增 stopListening() 方法,可用于定制化关闭 MQ 修复:Junit 代码覆盖率测试可能出现多次启动的问题 修复:JbootCron4jPlugin 停止后未移除已经停止任务的问题 优化:优化 fastjson 序列化的功能,使用 config 而非 features 优化:重命名注解 @TxEnable() 修改为 @Transactional(),并为 @Transactional() 添加更多的配置功能 优化:为 RabbitMQ 添加更多的自定义配置 优化:自动检测是否依赖 jfinal-wexin 并自动配置 JbootAccessTokenCache 优化:删除 JacksonSerializer 等无用的代码文件 优化:优化配置文件的的自动探测功能,防止在某些新手未编译直接运行找不到配置文件的问题 优化:优化 JbootHttpImpl 和 JbootHttpResponse 代码,添加必要的日志输出 优化:更新 Copyright 优化:升级相关依赖到最新版本 文档:完善关于 Controller 和 数据库的相关文档 Jboot 开发文档: http://www.jboot.com.cn 同时,Jboot 官方也推出了收费的、企业级快速开发框架 JbootAdmin (如下图所示),真诚的为各位开发者提供一站式、保姆式服务。请咨询海哥。 更多关于 JbootAdmin 请参考:http://www.jboot.com.cn/jbootadmin/feature.html Maven 依赖: <dependency> <groupId>io.jboot</groupId> <artifactId>jboot</artifactId> <version>3.14.0</version> </dependency> Hello World: @RequestMapping("/") public class HelloWorld extends JbootController { public void index(){ renderText("hello world"); } public static void main(String[] args){ JbootApplication.run(args); } }

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册