当前位置: 首页 > news >正文

使用 OpenSearch 的 K-NN 向量搜索来增强搜索功能

使用 OpenSearch 的 K-NN 向量搜索来增强搜索功能

许多应用程序都依赖于提供精确且相关的搜索结果的能力。尽管传统关系数据库的全文搜索功能在某些情况下已经足够,但这些数据库在从文本中提取语义含义或搜索结构化程度较低的数据方面可能会出现不足。在这篇博文中,我们将探讨如何使用 DigitalOcean 管理的 OpenSearch 和一组称为 K-Nearest Neighbor 向量搜索 (K-NN) 的技术来解决这些限制。K-NN 使 OpenSearch 成为各种搜索和分析应用程序的强大而灵活的解决方案。

理解 K-NN 向量搜索

什么是 K-NN 向量搜索?

与依赖关键字匹配的传统搜索方法不同, K-NN 向量搜索 涉及将数据集中的每条记录表示为 封装 记录属性的向量。机器学习模型通常用于将数据 嵌入 到向量表示中。进行查询时,搜索引擎会计算查询向量与数据向量之间的距离,并根据预定义的距离度量(例如欧几里得距离或余弦相似度)返回最近邻。

为什么使用 OpenSearch 进行 K-NN 向量搜索?

OpenSearch 简介

OpenSearch 是一款高度可扩展的开源搜索和分析引擎。它以 Elasticsearch 的优势为基础,提供强大的全文搜索、日志分析等功能。随着向量搜索功能的引入,OpenSearch 将其实用性扩展到更高级的用例,例如自然语言处理、推荐系统和图像检索。

使用OpenSearch进行向量搜索的好处

可扩展性: 开放搜索能够高效处理大量数据和查询。使用近似最近邻算法,开放搜索能够以更快的速度提供相关搜索结果,且占用的内存更少。

灵活性: 支持各种类型的数据和搜索功能,适用于各种应用程序。

社区和支持: 作为开源软件,它受益于活跃的社区和定期的更新。

设置 OpenSearch 进行 K-NN 向量搜索

安装 OpenSearch

首先,您需要安装 OpenSearch。以下是提取并运行最新版本的 OpenSearch Docker 映像的基本命令:

docker pull opensearchproject/opensearch:latest


docker run -d --name opensearch -p 9200:9200 -e "discovery.type=single-node" -e "OPENSEARCH_INITIAL_ADMIN_PASSWORD=<your-strong-password>” opensearchproject/opensearch:latest

注意: 尝试运行 opensearch docker 容器时,需要设置初始管理员密码。该密码至少应为 8 个字符,并且必须至少包含一个大写字母、一个小写字母、一个数字和一个强特殊字符。

配置OpenSearch进行向量搜索

安装 OpenSearch 后,下一步是启用 K-NN 插件。在自管理集群上,这涉及修改集群的配置文件。

实现 K-NN 向量搜索

要使用 K-NN 向量搜索,您必须首先创建带有向量字段的索引。您可以通过导航到 Opensearch 开发控制台并 提交以下请求https:// {CLUSTER_HOST}/app/dev_tools#/console来执行此操作。或者,您可以将这些命令作为 HTTP 请求发送到 https:// {CLUSTER_HOST}:9200 。

PUT /my_vector_index

{

  "mappings": {

    "properties": {

      "my_vector": {

        "type""K-NN_vector",

        "dimension": 128

      }

    }

  }

}

通过此请求,您创建了一个索引 my_vector_index ,您可以使用该索引使用 128 维嵌入来存储和查询数据。现在,您可以使用以下请求开始将文档及其向量表示添加到索引中。

PUT /my_vector_index/_doc/1

{

  "my_vector": [0.1, 0.2, ... , 0.128],

  "description""Sample document"

}

最后,要对这些文档执行 K-NN 搜索,您可以使用以下查询。

POST /my_vector_index/_search

{

  "size": 5,

  "query": {

    "K-NN": {

      "my_vector": {

        "vector": [0.1, 0.2, ... , 0.128],

        "k": 5

      }

    }

  }

}

用例和应用

让我们介绍一些可以利用 Opensearch 的 K-NN 功能的端到端应用程序。

客户支持聊天机器人: 向量搜索通常用于查找语义相似的文本。聊天机器人服务可能会使用机器学习模型将传入查询(例如“如何重置密码?”)嵌入到向量中,然后使用 K-NN 向量搜索在知识库中查找类似查询,例如“我忘记了密码,如何重置?”。聊天机器人可以使用此信息根据这些类似查询为用户提供更有帮助的响应。

电子商务平台: K-NN 向量搜索可以根据向量表示查找与用户偏好相似的项目,从而增强推荐系统。例如,从网上商店购买书籍的用户可能会被推荐同一作者的其他书籍、同一类型的书籍,甚至是具有类似偏好的其他用户购买的书籍。在此示例中,书籍的向量表示可能包括作者、类型、评分和评论中的关键字等属性。

时尚零售商: 通过使用深度学习模型将图像转换为矢量,K-NN 矢量搜索可用于从数据库中检索视觉上相似的图像。用户可以上传一张红色连衣裙的照片。系统处理该图像以创建代表连衣裙视觉特征的矢量。使用 K-NN 矢量搜索,平台检索并显示具有各种红色色调、相似剪裁和设计的类似连衣裙,帮助用户准确找到他们想要的东西。

使用 K-NN 与 OpenSearch 的挑战和注意事项

1. 向量维数 高维向量会导致计算复杂度增加。平衡向量维数和性能要求非常重要。幸运的是,OpenSearch 有多种 K-NN 方法 ,它们都有各自的性能特征。虽然每种方法都旨在返回与传入向量距离最小的向量,但有些方法可以进行调整,以优先考虑内存使用、响应时间或准确性。

2.数据规范化 确保数据规范化和一致性对于K-NN搜索结果的准确性至关重要。

3. 性能调优 优化 OpenSearch 设置和硬件资源对于高效处理大规模向量搜索至关重要。

结论

K-NN 向量搜索为跨不同领域提供高度相关的搜索结果开辟了新的可能性。通过利用 OpenSearch 的强大功能,开发人员可以相对轻松地实现高级搜索功能。无论是用于推荐系统、图像检索还是 NLP 应用程序,OpenSearch 的 K-NN 向量搜索都是搜索技术领域的宝贵工具。

原文链接:https://www.digitalocean.com/blog/enhancing-search-capabilities-with-k-nn-vector-search-in-opensearch?ref=dailydev

本文由 mdnice 多平台发布

相关文章:

使用 OpenSearch 的 K-NN 向量搜索来增强搜索功能

使用 OpenSearch 的 K-NN 向量搜索来增强搜索功能 许多应用程序都依赖于提供精确且相关的搜索结果的能力。尽管传统关系数据库的全文搜索功能在某些情况下已经足够&#xff0c;但这些数据库在从文本中提取语义含义或搜索结构化程度较低的数据方面可能会出现不足。在这篇博文中&…...

Less-2(闭合)

我们使用第一关的测试方法尝试一下,打咩 直接看源码&#xff0c;看到&#xff0c;尝试一下闭合 <?php ini_set("display_errors", 0); $str $_GET["keyword"]; echo "<h2 aligncenter>没有找到和".htmlspecialchars($str)."相…...

mysql介绍

MySQL是一种开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛用于存储和管理数据。它支持多种操作系统&#xff0c;如Linux、Windows、MacOS等。MySQL的特点包括&#xff1a; 1.开源免费&#xff1a;MySQL是开源的&#xff0c;可以免费使用和分发。 2…...

【ROS学习】ROS中 use_sim_time 参数的含义与作用

文章目录 写在前面一、背景描述二、 use_sim_time 参数的含义与作用三、举例说明1. 不设置use_sim_time (也即 use_sim_time false)&#xff0c;播放数据集使用rosbag play **.bag 2. 不设置use_sim_time (也即 use_sim_time false)&#xff0c;播放数据集使用rosbag play **…...

python-查找元素3(赛氪OJ)

[题目描述] 有n个不同的数&#xff0c;从小到大排成一列。现在告诉你其中的一个数x&#xff0c;x不一定是原先数列中的数。你需要输出最后一个<x的数在此数组中的下标。输入&#xff1a; 输入共两行第一行为两个整数n、x。第二行为n个整数&#xff0c;代表a[i]。输出&#x…...

苹果 Safari 的隐私保护与广告追踪问题 :技术进展与挑战

隐私保护的进展与挑战 近年来&#xff0c;浏览器行业在隐私保护技术方面取得了显著进展&#xff0c;尤其是在广告追踪领域。谷歌的 Chrome 浏览器推广了隐私沙盒&#xff0c;通过将用户可能感兴趣的主题分类并推送给广告商。Mozilla Firefox 和 Meta Facebook 则推出了一种名为…...

pytest之fixture

Pytest 中 Fixture 的 yield 用法 在软件测试中&#xff0c;设置和清理测试环境是一个重要的环节。Pytest 作为一个功能强大的测试框架&#xff0c;通过 Fixture 机制简化了这一过程。特别是yield语句的使用&#xff0c;使得 Fixture 能够在测试前进行设置&#xff0c;并在测试…...

Rancher

文章目录 Rancher1. 安装和配置2. 服务部署和管理3. 容器自动化缩容和扩容 Rancher Rancher 是一个开源的企业级容器管理平台&#xff0c;旨在简化容器化应用的部署、管理和运维。它支持多种容器编排引擎&#xff0c;如 Kubernetes、Docker Swarm 等&#xff0c;并提供了统一的…...

Wordpress建站问题记录

从一月到七月因为工作的情况没有进行太深入的开发,想着整理一下把做一个独立站把博客多个渠道发布一下,遇到几个问题在这里记录一下. 先写一下我的配置 系统: centos7 php: 7.4 wordpress: 6.6.1 mysql:8.0.6 1. HTTP 500 Internal 这个问题出现在我将wordpress的文件夹全部…...

JavaFx中通过线程池运行或者停止多个周期性任务

在JavaFX中&#xff0c;要实现点击按钮启动多个周期性任务并通过多线程执行&#xff0c;并在任务结束后将结果写入多个文本组件中&#xff0c;同时提供另一个按钮来停止这些任务&#xff0c;你可以使用ScheduledExecutorService来管理周期性任务&#xff0c;并使用AtomicBoolea…...

使用RabbitMQ实现异步支付状态通知

在支付系统中&#xff0c;如何确保支付状态的准确传递和处理显得尤为重要。今天&#xff0c;我们将以一个支付流程为例&#xff0c;探讨在引入RabbitMQ前后的实现和优化。 改造前 在引入RabbitMQ之前&#xff0c;我们通常会直接在支付方法中完成所有的操作。这包括查询支付单…...

[最短路dijkstra],启动!!!

总时间复杂度为 O ( ( n m ) log ⁡ m &#xff09; P4779 【模板】单源最短路径&#xff08;标准版&#xff09; #include<bits/stdc.h> #define ll long long #define fi first #define se second #define pb push_back #define PII pair<int,int > #define I…...

Java企业微信服务商代开发获取AccessToken示例

这里主要针对的是企业微信服务商代开发模式 文档地址 可以看到里面大致有三种token&#xff0c;一个是服务商的token&#xff0c;一个是企业授权token&#xff0c;还有一个是应用的token 这里面主要有下面几个参数 首先是服务商的 corpid 和 provider_secret &#xff0c;这个可…...

How does age change how you learn?(2)年龄如何影响学习能力?(二)

Do different people experience decline differently? 不同人经历的认知衰退会有不同吗? Do all people experience cognitive decline uniformly?Or do some people’s minds slip while others stay sharp much longer? 所有人经历的认知衰退都是一样的吗?还是有些人…...

可验证随机函数 vrf 概述

一、什么是VRF 背景: 在传统的区块链中,常用的随机算法是基于伪随机数生成器(Pseudorandom Number Generator,PRNG)的。PRNG是一种确定性算法,它根据一个初始种子生成一个看似随机的序列。在区块链中,通常使用的是伪随机数序列来选择区块的创建者、确定验证节点的轮换…...

鸿蒙双向绑定组件:TextArea、TextInput、Search、Checkbox,文本输入组件,图案解锁组件PatternLock

对象暂不支持双向绑定&#xff0c; 效果&#xff1a; 代码&#xff1a; Entry Component struct MvvmCase {StateisSelect: boolean falseStatesearchText: String ""StateinputText: string ""StateareaText: string ""build() {Grid() {G…...

JS 算法 - 计数器

theme: smartblue 题目描述 给定一个整型参数 n&#xff0c;请你编写并返回一个 counter 函数。这个 counter 函数最初返回 n&#xff0c;每次调用它时会返回前一个值加 1 的值 ( n , n 1 , n 2 &#xff0c;等等)。 示例 1&#xff1a; 输入&#xff1a; n 10 ["cal…...

JavaScript基础——JavaScript运算符

赋值运算符 算术运算符 一元运算符 三元/三目运算符 比较运算符 逻辑运算符 运算符优先级 在JavaScript中&#xff0c;常见的运算符可以包括赋值运算符、一元运算符、算术运算符&#xff08;二元运算符&#xff09;、三元/三目运算符、比较运算符、逻辑运算符等&#xff0…...

E23.【C语言】练习:不创建第三个变量实现两个整数的交换

目录 题目条件 思路1&#xff08; -&#xff09; 思路2 &#xff08;^&#xff09;(XOR) 往期推荐 1.题目条件 禁止使用以上代码 2.思路1&#xff1a; -运算 aab; ba-b; aa-b; 但这样有潜在的问题 :a&#xff0c;b存储的数字过大&#xff0c;ab可能超过范围 因此改用思路2…...

如何搭建一个web系统?

需求 搭建一个web系统。 框架 设计:墨刀 前端:Vue.js 后端:Java 算法:Python 数据库:时序数据库,介绍 部署:Jekins https://www.jenkins.io/ 文档管理:Teambition 项目管理:禅道 代码管理:Gitlab 开发流程 设计文档和原型文档&#xff0c;功能接口设计&#xff0…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...