Elasticsearch:结合两全其美:Elasticsearch 与 BM25 和 HNSW 的混合搜索

news2024/11/17 5:51:34

 

就搜索算法而言,没有万能的解决方案。 不同的算法在不同的场景下效果更好,有时需要算法的组合才能达到最好的效果。 在 Elasticsearch 中,一种流行的组合搜索算法的方法是使用混合搜索,将用于文本搜索的 BM25 算法与用于最近邻搜索的 HNSW 算法相结合。 在这篇博文中,我们将探讨 Elasticsearch 中混合搜索的优势、挑战和用例。

BM25 是一种广泛用于文本搜索的算法,它根据查询中每个词的词频(TF)和逆向文档频率(IDF)计算分数。 正如我们在之前的博文中看到的,HNSW 是一种用于近似最近邻搜索的算法,它构建了一个由互连节点组成的小世界图。 通过结合这两种算法,我们可以执行结合两者优势的混合搜索。

混合搜索的最大挑战之一是平衡两种算法的权重。 换句话说,我们需要决定在组合它们时给 BM25 分数和给 HNSW 分数多少权重。 这可能很棘手,因为最佳权重可能会因数据和特定搜索场景而异。

但是,如果操作得当,混合搜索可以显着提高搜索准确性和效率。 例如,在电子商务应用程序中,混合搜索可用于将文本搜索与视觉搜索相结合,使用户能够找到与其文本和视觉查询相匹配的产品。 在科学应用中,混合搜索可用于将文本搜索与高维数据的相似性搜索相结合,使研究人员能够根据文本内容和数据找到相关文档。

让我们看一个例子,看看如何在 Elasticsearch 中实现混合搜索。 首先,我们需要使用包含 BM25 和 HNSW 相似性算法的映射来索引我们的数据:


PUT byte-image-index
{
  "mappings": {
    "properties": {
      "byte-image-vector": {
        "type": "dense_vector",
        "element_type": "byte",
        "dims": 2,
        "index": true,
        "similarity": "cosine"
      },
      "title": {
        "type": "text"
      }
    }
  }
}

在这里,我们定义了一个映射,其中包括用于 BM25 文本搜索的 title 字段和用于 HNSW 高维数据相似性搜索的 byte-image-vector 字段。我们索引一下数据:

POST byte-image-index/_bulk?refresh=true
{ "index": { "_id": "1" } }
{ "byte-image-vector": [5, -20], "title": "moose family" }
{ "index": { "_id": "2" } }
{ "byte-image-vector": [8, -15], "title": "alpine lake" }
{ "index": { "_id": "3" } }
{ "byte-image-vector": [11, 23], "title": "full moon" }

接下来,我们可以使用文本和矢量字段执行搜索,如下所示:

POST byte-image-index/_search
{
  "query": {
    "match": {
      "title": {
        "query": "mountain lake",
        "boost": 0.9
      }
    }
  },
  "knn": {
    "field": "byte-image-vector",
    "query_vector": [6, 10],
    "k": 5,
    "num_candidates": 50,
    "boost": 0.1
  },
  "size": 10
}

此搜索查询结合了 title 字段上的 match 查询和 image-vector 字段上的 knn 查询,使用了我们之前定义的混合相似性算法。 在此示例中,我们为 BM25 和 HNSW 使用了 0.9 和 0.1 的权重,但您可以尝试使用不同的权重来找到适合你的数据和搜索场景的最佳平衡点。 总之,Elasticsearch 中的混合搜索是一种强大的技术,可以结合不同搜索算法的优势,以实现更好的搜索准确性和效率。 通过将用于文本搜索的 BM25 算法与用于最近邻搜索的 HNSW 算法相结合,用户可以在其搜索和分析应用程序中利用这两种算法的强大功能。 通过仔细调整两种算法的权重,混合搜索可以成为从电子商务到科学研究等广泛应用的强大工具。

上述搜索结果为:

{
  "took": 10,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 3,
      "relation": "eq"
    },
    "max_score": 0.9070214,
    "hits": [
      {
        "_index": "byte-image-index",
        "_id": "2",
        "_score": 0.9070214,
        "_source": {
          "byte-image-vector": [
            8,
            -15
          ],
          "title": "alpine lake"
        }
      },
      {
        "_index": "byte-image-index",
        "_id": "3",
        "_score": 0.09977779,
        "_source": {
          "byte-image-vector": [
            11,
            23
          ],
          "title": "full moon"
        }
      },
      {
        "_index": "byte-image-index",
        "_id": "1",
        "_score": 0.014644662,
        "_source": {
          "byte-image-vector": [
            5,
            -20
          ],
          "title": "moose family"
        }
      }
    ]
  }
}

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

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

相关文章

数据结构与算法十 并查集

一 并查集 并查集是一种树型的数据结构 ,并查集可以高效地进行如下操作: 查询元素p和元素q是否属于同一组合并元素p和元素q所在的组 1.1 并查集结构 并查集也是一种树型结构,但这棵树跟我们之前讲的二叉树、红黑树、B树等都不一样&#xf…

【Stable Diffusion】基本概念之hypernetwork

1.基本概念 hypernetwork,中文名为超网络,是一种神经网络架构,它允许动态生成神经网络的参数(权重)。简而言之,hypernetwork可以生成其他神经网络。 在Stable Diffusion中,hypernetwork被用于动态生成分类器的参数,为Stable Diffusion模型添加…

牛客刷SQL题Day5

SQL69 返回产品并且按照价格排序 select prod_name , prod_price from Products where prod_price between 3 and 6 select prod_name , prod_price from Products where 6>prod_price and prod_price >3 踩坑1: between......and.......包括边界。 踩坑2&am…

ES6之箭头函数

文章目录 前言一、定义二、简化1.当函数参数只有一个时2.当函数体只有一条return语句时 三、注意1.箭头函数的this2.不能作为构造函数实例化对象3.不能使用argument变量 总结 前言 简单的讲,箭头函数是将原function关键字和函数名删掉的一种简写函数形式。 一、定义…

二维体光子晶体的平面波展开法代码

%书上的代码,和FEM符合的更好 %在这个代码里试着把单位原胞的相对介电常数分布画出来 %这个代码的单位原胞的中心就是(0,0)点,也就是坐标原点 %The program for the computation of the PhC photonic %band structure for 2D PhC. %Parameters of the st…

Jvm --java虚拟机(上)

为什么学习jvm 如果你这辈子只甘心做一个平庸的Java码农,那么你可以利用阅读本文的时间去学习其他新的技术知识,但是如果你想成为一个更更更更优秀的中高级程序员!那么请继续阅读本文,希望这篇文章会对你有所帮助,那么…

国考省考结构化面试:综合分析题,名言哲理(警句观点启示)、漫画反驳题等

国考省考结构化面试:综合分析题,名言哲理(警句观点启示)、漫画反驳题等 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测&a…

从面向过程到面向对象

目录 1、抽象 2、UML类图 3、类定义 4、类成员函数 (1)构造函数(constructor) (2)析构函数(destructor) 5、对象实现 6、封装 7、getter、setter方法 为什么要从面向过程转…

C++实现ini配置文件解析——API设计

什么是配置文件 INI文件(Initialization File)是一种文本文件格式,通常用于存储配置数据。INI文件最初由Microsoft在Windows系统中引入,用于存储应用程序的配置信息。 INI文件的结构相对简单,由一系列的节&#xff0…

国外15家值得关注的AI创业公司

文 | 小戏、iven 星星之火,可以燎原。 在大模型横空出世的这个疯狂的春天,一场关于 AI 产品的革命也正在席卷全球。这边是大公司一个接一个模型搞军备竞赛,那边是各路豪强纷纷下场创业招兵买马。那么,除了咱们耳熟能详的 OpenAI 以…

数字化转型导师坚鹏:企业数字化营销

企业数字化营销 ————助力零售业务向批量化开发转变,对公业务向智慧化转变 课程背景: 很多企业存在以下问题: 不清楚数字化营销对企业发展有什么影响? 不知道如何提升企业数字化营销能力? 不知道企业如何开…

面试官:一千万的数据,你是怎么查询的

面试官:一千万的数据,你是怎么查询的? 前言 面试官:来说说,一千万的数据,你是怎么查询的?B哥:直接分页查询,使用limit分页。面试官:有实操过吗?B…

word@通配符@高级搜索查找@替换@中英文标点符号替换

文章目录 高级搜索通配符批量选中引用序号上标调整搜索替换作用范围设置🎈通过样式选择作用区域通过鼠标选择作用区域 高级替换操作顺序 标点符号替换🎈将英文逗号替换为中文逗号使用普通查找和替换:使用通配符替换 将英文句点替换为中文句号…

【Stable Diffusion】ControlNet基本教程(二)

接上篇【Stable Diffusion】ControlNet基本教程(一),本篇介绍两个ControlNet常见的基本用法,更多用法欢迎关注博主,博主还会更新更多有趣的内容。 3.ControlNet基本用法 3.1漫画线稿上色 (1)上传…

Mysql索引(3):索引分类

1 索引分类 在MySQL数据库,将索引的具体类型主要分为以下几类:主键索引、唯一索引、常规索引、全文索引。 分类含义特点关键字主键索引针对于表中主键创建的索引 默认自动创建, 只能有一个 PRIMARY 唯一索引 避免同一个表中某数据列中的值重复可以有多…

Graph Embeddings—随机游走基本概念

Random Walk Approaches for Node Embeddings 一、随机游走基本概念 想象一个醉汉在图中随机的行走,其中走过的节点路径就是一个随机游走序列。 随机行走可以采取不同的策略,如行走的方向、每次行走的长度等。 二、图机器学习与NLP的关系 从图与NLP的…

【计算机网络】总结篇

【C语言部分】总结篇 【操作系统】总结篇 【数据库(SQL)】总结篇 本文目录 1. 简述网络七层参考模型及每一层的作用2. 简述静态路由和动态路由3. 说说有哪些路由协议,都是如何更新的4. 简述域名解析过程,本机如何干预域名解析5. 简…

智能算法系列之粒子群优化算法

本博客封面由ChatGPT DALLE 2共同创作而成。 文章目录 前言1. 算法思想2. 细节梳理2.1 超参数的选择2.2 一些trick 3. 算法实现3.1 问题场景3.2 python实现 代码仓库:IALib[GitHub] 前言 本篇是智能算法(Python复现)专栏的第三篇文章,主要介绍粒子群优化…

2023年的深度学习入门指南(9) - SIMD和通用GPU编程

2023年的深度学习入门指南(9) - SIMD和通用GPU编程 深度学习从一开始就跟GPU有不解之缘,因为算力是深度学习不可或缺的一部分。 时至今日,虽然多任务编程早已经深入人心,但是很多同学还没有接触过CPU上的SIMD指令,更不用说GPGPU…

【Segment Anything Model】论文+代码实战调用SAM模型预训练权重+相关论文

上篇文章已经全局初步介绍了SAM和其功能,本篇作为进阶使用。 文章目录 0.前言1.SAM原论文 1️⃣名词:提示分割,分割一切模型,数据标注,零样本,分割一切模型的数据集 2️⃣Introduction 3️⃣Task: prompta…