Milvus中如何实现全文检索(Full Text Seach)?

news2025/3/3 4:17:13

在前两篇文章中(Milvus python库 pymilvus 常用操作详解之Collection(上) 和 Milvus python库 pymilvus 常用操作详解之Collection(下)),我们了解了Milvus基于dense vector和sparse vector实现的混合向量检索,这篇文章让我们着重了解一下基于sparse vector的检索,即全文检索。

何为全文检索?

以下来自 milvus 官方文档原文:

Full text search is a feature that retrieves documents containing specific terms or phrases in text datasets, then ranking the results based on relevance. This feature overcomes semantic search limitations, which might overlook precise terms, ensuring you receive the most accurate and contextually relevant results. Additionally, it simplifies vector searches by accepting raw text input, automatically converting your text data into sparse embeddings without the need to manually generate vector embeddings.

全文搜索是一种功能,可以在文本数据集中检索包含特定术语或短语的文档,并根据相关性对结果进行排序。该功能克服了语义搜索的限制,语义搜索可能会忽略精确的术语,而全文搜索则确保您获得最准确且在语境上相关的结果。此外,它通过接受原始文本输入来简化向量搜索,自动将您的文本数据转换为稀疏嵌入,而无需手动生成向量嵌入。(ChatGPT-4o翻译)

简而言之,全文检索是一种基于精准关键词匹配的检索方式,相较于基于深度学习生成的向量检索(适合语义匹配检索场景),全文检索在需要基于精确关键词进行匹配的检索场景下表现更佳。当然各取其长将两者结合起来实现混合检索也是非常建议的选择。(感兴趣可以前往 BGE-M3模型结合Milvus向量数据库强强联合实现混合检索)

全文检索的流程

Milvus 将实现全文检索一共分为了五个大的流程:

  1. 文本输入:无需人工将原始文本进行向量化处理,我们只需要提供被检索的内容或用户询问文本;
  2. 文本分析;Milvus 使用分析器将输入文本分解成单个的可搜索词条;
  3. 函数处理:内置函数接收已分词的词条,并将其转换为稀疏向量表示;
  4. 集合存储:Milvus 将这些稀疏嵌入存储在一个集合中,以便高效检索;
  5. BM25 评分:在检索时,Milvus 应用 BM25 算法计算查询文本和存储文档的相关性得分,并对匹配结果进行排序。
    在这里插入图片描述

代码实现

主要分为三个步骤:

  1. 创建集合:设置一个具有必要字段的集合,并定义一个函数将原始文本转换为稀疏向量;

  2. 插入数据:将原始文本文档和生成的稀疏向量表达导入集合;

  3. 执行搜索:使用查询文本搜索集合并得到检索相关结果。

如果希望基于 BM25算法,则参考官方文档代码示例。

一、创建集合

  1. 定义字段模式(分别用于主键、原始文本和稀疏向量的存储):
text_fields = [
    FieldSchema(name="id", dtype=DataType.INT64,
                is_primary=True, auto_id=True),
    FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=512),
    FieldSchema(name="sparse_vector", dtype=DataType.SPARSE_FLOAT_VECTOR)
]
  1. 定义集合模式并创建集合:
text_schema = CollectionSchema(text_fields, "")
# Now we can create the new collection with above name and schema.
col = Collection('text_search_demo', 
                 text_schema, 
                 consistency_level="Strong")
  1. 函数准备:

这里使用 bge-m3 模型实现将原始文本转化为稀疏向量的表达。

from FlagEmbedding import BGEM3FlagModel

model_dir = "bge-m3"
model = BGEM3FlagModel(model_dir) 

def get_docs_embeddings(docs):
    passage_embeddings = model.encode(
    docs, 
    return_dense=False, 
    return_sparse=True, 
    return_colbert_vecs=False)
    docs_embeddings = {}
    docs_embeddings["sparse"] = passage_embeddings["lexical_weights"]
    return docs_embeddings
  1. 将检索文本和被检索的文档内容进行向量化:
# 文档列表向量化
docs = [
    "提供黄金品种查询服务,支持黄金现货、黄金期货等品种查询;提供黄金价格查询服务,支持查询最新价、开盘价、最高价、最低价等价格信息。",
    "根据股票编号查询股票信息,包括涨跌额、股票名称、开盘价、收盘价、当前价格、最高最低价、竞买价等信息;支持沪深、香港、美国三个市场的股票数据查询,覆盖全球各地的股票信息。",
    "提供最新的新闻头条信息,包括国内、国际、体育、娱乐、科技等各类资讯,让用户获取及时的新闻报道;支持按照不同的新闻分类进行查询,用户可以选择感兴趣的领域,如体育、科技、娱乐等,获取相关的新闻内容。"
]
docs_embeddings = get_docs_embeddings(docs)

# 查询文本向量化
query = "请问股票代码为TSLA的美股今日走势如何?"
query_embeddings = get_query_embeddings(query)

二、插入数据

  1. 将原始文本和稀疏向量插入创建好的集合:
entities = [docs, docs_embeddings["sparse"]]
col.insert(entities)
  1. 为名为“sparse_vector”的稀疏向量字段创建索引:
sparse_index = {"index_type": "AUTOINDEX", 
                "metric_type": "BM25"}
col.create_index("sparse_vector", sparse_index)

三、执行检索

类似于混合检索的实现,我们也是调用集合的 hybrid_search() 函数:

  1. 设置top k,使用最大近似近邻检索:
k = 1 # we want to get the top 1 docs closest to the query
# Prepare the search requests for both vector fields
sparse_search_params = {"metric_type": "IP"}
sparse_req = AnnSearchRequest(query_embeddings["sparse"],
                          "sparse_vector", sparse_search_params, limit=k)
  1. 调用 hybrid_search() 函数,获取rerank即重排序后的检索结果:
res = col.hybrid_search([sparse_req], rerank=RRFRanker(),
                            limit=k, output_fields=['text'])
  1. 查看检索结果:
print(res)

data: ['["id: 454487605193942682, distance: 0.016393441706895828, entity: {\'text\': \'根据股票编号查询股票信息,包括涨跌额、股票名称、开盘价、收盘价、当前价格、最高最低价、竞买价等信息;支持沪深、香港、美国三个市场的股票数据查询,覆盖全球各地的股票信息。\'}"]'], cost: 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2257469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

unity打包web,如何减小文件体积,特别是 Build.wasm.gz

unity打包WebGL,使用的是wasw,最终生成的Build.wasm.gz体积很大,有6.5M,有几个方法可以稍微减小这个文件的大小 1. 裁剪引擎代码: 此步可将大小从6.5减小到 6.2(此项默认开启,只是改了裁剪等级…

STM32 CubeMx HAL库 独立看门狗IWDG配置使用

看门狗这里我就不多介绍了,能搜到这篇文章说明你了解 总之就是一个单片机重启程序,设定好超时时间,在超时时间内没有喂狗,单片机就会复位 主要应用在单片机异常重启方面,比如程序跑飞(注意程序跑飞时你就…

Selenium:强大的 Web 自动化测试工具

Selenium:强大的 Web 自动化测试工具 在当今的软件开发和测试领域,自动化工具的重要性日益凸显。Selenium 就是一款备受欢迎的 Web 自动化测试工具,它为开发者和测试人员提供了强大的功能和便利。本文将详细介绍 Selenium 是什么&#xff0c…

幼儿园学校养老院供电安全解决方案

一、 电气火灾每年以30%的比例高居各类火灾原因。以50%到80%的比例高居重特大火灾。已成为业界重点关注的对象并为此进行着孜孜不倦的努力。2021年“119”消防日,国家应急管理部消防救援局公布了2021年1至10月份全国火灾形势报告。数据显示,从火灾种类来…

UnityShaderLab-实现沿y轴溶解效果

实现思路: 实现思路同UnityShaderLab-实现溶解效果-CSDN博客 ShaderGraph实现: ShaderLab实现: 效果: 未完待续。。。

5G Multi-TRP R16~R18演进历程

提升小区边缘用户的性能,在覆盖范围内提供更为均衡的服务质量,NR中引入了多TRP协作传输的方案。多TRP协作传输通过多个TRP之间进行非相干联合传输(Non Coherent-Joint Transmission,NC-JT)、重复传输/接收或…

deepin 搭建 hadoop singlenode

deepin 搭建 hadoop singlenode 一、准备 1、升级软件 sudo apt updatesudo apt -y dist-upgrade2、安装常用软件 sudo apt -y install gcc make openssl libssl-dev libpcre3 libpcre3-dev libgd-dev \rsync openssh-server vim man zip unzip net-tools tcpdump lrzsz ta…

计算机毕业设计Python中华古诗词知识图谱可视化 古诗词智能问答系统 古诗词数据分析 古诗词情感分析模型 自然语言处理NLP 机器学习 深度学习

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

pythonbug修复案例----修复 Python数据分析程序中的持续 Bug

在 Python 编程的世界里,Bug 就像隐藏在暗处的幽灵,时不时地跳出来捣乱。而持续出现的 Bug,则更是让人头疼不已。今天,就让我们一同踏上修复一个 Python 持续 Bug 的征程。 假设我们正在开发一个简单的数据分析程序,其…

YOLOv8改进,YOLOv8引入U-Netv2分割网络中SDI信息融合模块+GSConv卷积,助力小目标

理论介绍 完成本篇需要参考以下两篇文章,并已添加到YOLOv8代码中 YOLOv8改进,YOLOv8引入GSConv卷积+Slim-neck,助力小目标检测,二次创新C2f结构YOLOv8改进,YOLOv8引入U-Netv2分割网络中SDI信息融合模块,助力小目标检测下文都是手把手教程,跟着操作即可添加成功 目录 理…

双指针解题

双指针的使用范围 对于暴力解法的时间复杂度来说,双指针一般可以将暴力解法的时间复杂度降低一个量级. 常⻅的双指针有两种形式,⼀种是对撞指针,⼀种是左右指针. 快慢指针 ⼜称为⻳兔赛跑算法,其基本思想就是使⽤两个移动速度…

Linux安装Python2.7.5(centos自带同款)

卸载已安装的python,防止版本兼容问题 rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps 删除残余文件 whereis python |xargs rm -frv 安装前提是已安装gcc和g gcc --version g --version 下载安装python2.7.5 https://www.python.org/downloads/release/pyt…

Linux多进程开发-常用命令

进程 进程是计算机中正在运行的程序的实例。每个进程都有自己的地址空间、内存、文件和设备、线程以及其他系统资源。操作系统通过调度和管理进程来实现多任务处理,使得多个进程可以同时运行并与用户交互。在操作系统中,进程是基本的资源分配单位&#x…

appium学习之二:adb命令

1、查看设备 adb devices 2、连接 adb connect IP:端口 3、安装 adb install xxx.apk 4、卸载 adb uninstall 【包名】 5、把对应目录下的1.txt文件传到手机sdcard下 adb push 1.txt /sdcard 6、进入对应的设备里 adb shell 7、切入sdcard目录 cd /sdcard 8、ls 查…

Redis篇-3--原理篇2--Redis事务

1、概述 Redis 提供了简单的事务机制,Redis 事务的本质是一组命令的集合。当执行redis事务时,即一次性按照添加顺序依次执行这些命令,中间不会被打断或者干扰。 Redis 的事务机制并不像关系型数据库中的事务那样提供完整的ACID特性&#xf…

简单网页制作提升用户体验和客户转化

在当今竞争激烈的市场中,用户体验和客户转化率往往是决定企业成败的关键。简单而高效的网页制作,正是提升用户体验和客户转化的重要手段之一。 首先,简洁的网页设计能够有效减轻用户的认知负担。当用户打开一个层次分明、界面整洁的网站时&am…

CDGA|数据治理:数据仓库”建设投入大、周期长怎么办?

在数据治理的广阔领域中,数据仓库的建设无疑是一项至关重要的任务。然而,这项任务往往伴随着巨大的投入和漫长的周期,成为许多企业面临的棘手问题。数据仓库作为数据存储、处理和分析的核心平台,其建设不仅需要大量的资金和技术支…

大中型水闸安全监测系统

一、背景 水闸作为水利工程中的重要组成部分,承担着调节水位、控制水流、防洪排涝等多重功能。然而,水闸在运行过程中会受到各种自然和人为因素的影响,导致其安全性能下降,甚至发生安全事故。为了保障水闸的安全运行,…

STL之空间配置器allocator

STL之空间配置器allocator 空间配置器的标准接口设计一个简单的空间配置器, JJ::allocator 具备次配置力(sub-allocation)的SGI空间配置器SGI标准的空间配置器, std::allocatorSGI特殊的空间配置器, std::alloc构造和析构基本工具:construct()和destroy()空间的配置与释放,std:…

人大金仓(KingBaseEs)数据库操作手册

人大金仓数据库(KingbaseES)是由北京人大金仓信息技术股份有限公司(简称人大金仓)自主研发的、具有自主知识产权的通用关系型数据库管理系统。 官方下载地址:KingbaseES 人大金仓数据库 KES技术文档在线手册&#xf…