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

Elasticsearch:使用稀疏向量提升相关性

作者:来自 Elastic Vincent Bosc

学习如何在 Elasticsearch 中使用稀疏向量,以最小的复杂性提升相关性并实现搜索结果个性化。

稀疏向量是 ELSER 中的关键组件,但它们的用途远不止于此。在这篇文章中,我们将探讨稀疏向量如何在电商场景中提升搜索相关性:基于搜索行为(如点击)和用户偏好对文档进行加权。

什么是稀疏向量?

向量搜索是当前的热门话题,但大多数讨论集中在密集向量上:用于机器学习和神经搜索的紧凑型数值表示。而稀疏向量则采用了不同的路径。

与紧密压缩数据的密集向量不同,稀疏向量以更具可解释性和结构化的格式存储信息,通常包含大量的零。虽然没有那么受关注,但在合适的场景下,它们的能力是非常强大的。

💡 趣味小知识:稀疏向量和倒排索引都利用稀疏性来高效地表示和检索信息。

在 Elasticsearch 中,你可以使用 sparse_vector 字段类型来存储稀疏向量:这并不令人意外。

使用稀疏向量进行查询

在 Elasticsearch 中使用稀疏向量进行搜索的体验类似于传统的关键词搜索,但有所不同。稀疏向量查询(sparse vector queries)不是直接匹配词项,而是使用加权词项和点积,根据文档与查询向量的匹配程度来评分。

用例 1:通过信号增强提升搜索排名

信号增强是指强调某些特征或词项以提升搜索排名。当业务逻辑或用户行为表明某些结果应该排在更前时,这种方法尤其有用。

假设我们正在处理一个简单的电商索引:

PUT marketplace
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "query_boost": {
        "type": "sparse_vector"
      },
      "customer_types": {
        "type": "sparse_vector"
      }
    }
  }
}

现在,让我们只使用传统的 full text 类型来索引两个文档:

POST marketplace/_doc/1
{
  "title": "playstation 5 - special offer"
}

POST marketplace/_doc/2
{
  "title": "playstation controller"
}

对 “playstation” 的基本搜索会首先返回控制器,而不是因为它更相关,而是因为默认的词法评分算法 BM25 倾向于偏好较短的字段,导致标题简洁的控制器排名更高。更多的内容可以参阅 “Elasticsearch:分布式计分 - TF-IDF”。

GET marketplace/_search
{
  "query": {
    "match": {
      "title": "playstation"
    }
  }
}

"hits": [
  {
    "_index": "marketplace",
    "_id": "2",
    "_score": 0.21110919,
    "_source": {
      "title": "playstation controller"
    }
  },
  {
    "_index": "marketplace",
    "_id": "1",
    "_score": 0.160443,
    "_source": {
      "title": "playstation 5 - special offer"
    }
  }
]

但我们希望提升 console 的搜索结果,特别是因为它有特价优惠!

一种实现方式是通过稀疏向量将增强信号直接嵌入到文档中:

POST marketplace/_doc/1
{
  "title": "playstation 5 - special offer",
  "query_boost": [
    {"playstation": 3, "game console": 1}
  ]
}

这个文档现在在搜索查询 “playstation” 和 “game console” 中具有了额外的权重。

我们可以调整查询,以结合这个稀疏向量的增强效果:

GET marketplace/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "playstation"
          }
        }
      ],
      "should": [
        {
          "sparse_vector": {
            "field": "query_boost",
            "query_vector": {
              "playstation": 1
            }
          }
        }
      ]
    }
  }
}

"hits": [
  {
    "_index": "marketplace",
    "_id": "1",
    "_score": 3.160443,
    "_source": {
      "title": "playstation 5 - special offer",
    }
  },
  {
    "_index": "marketplace",
    "_id": "2",
    "_score": 0.21110919,
    "_source": {
      "title": "playstation controller"
    }
  }
]

得益于稀疏向量匹配所带来的额外得分,console 现在排在了 controller 之前,这正是我们想要的结果!

这种方法提供了一种替代传统增强技术的方式,例如 function_score 查询或字段级权重调整。通过使用稀疏向量将增强信息直接存储在文档中,你可以在调整相关性时获得更高的灵活性和透明度。同时,它还实现了业务逻辑与查询逻辑的解耦。

不过,也需要注意权衡:对于一些简单的使用场景,传统的增强方式可能更容易实现,并且在某些情况下性能更优。而当你需要更细粒度、具有多维控制的增强方式时,稀疏向量的优势就会凸显出来。

提醒: must 子句会进行过滤并影响评分,而 should 子句在条件匹配时会增加评分。

用例 2:使用稀疏向量实现个性化

稀疏向量同样可以实现个性化。你可以为客户特征或用户画像分配权重,并利用这些权重为个体用户展示最相关的产品。

以下是一个示例:

POST marketplace/_doc/3
{
  "title": "High fructose snack bar with artificial flavor"
}

POST marketplace/_doc/4
{
  "title": "Snack bar with whole food ingredients",
  "customer_types": {
    "healthy-conscious": 3
  }
}

假设 Jim 是一位偏好健康、可持续选项的客户:

POST user/_doc/jim
{
  "customer-types": {
    "healthy-conscious": 2
    "tech-savvy": 1,
    "eco-friendly": 1
  }
}

我们可以根据 Jim 的偏好定制搜索体验:

GET marketplace/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "snack bar"
          }
        }
      ],
      "should": [
        {
          "sparse_vector": {
            "field": "customer_types",
            "query_vector": {
              "healthy-conscious": 2,
              "tech-savvy": 1,
              "eco-friendly": 1
            }
          }
        }
      ]
    }
  }
}

"hits": [
  {
    "_index": "marketplace",
    "_id": "4",
    "_score": 7.2515574,
    "_source": {
      "title": "Snack bar with whole food ingredients",
      "customer_types": {
        "healthy-conscious": 3
      }
    }
  },
  {
    "_index": "marketplace",
    "_id": "3",
    "_score": 1.1612647,
    "_source": {
      "title": "High fructose snack bar with artificial flavor"
    }
  }
]

因此,更健康的能量棒出现在搜索结果的顶部,因为这更符合 Jim 的购买倾向。

这种通过稀疏向量实现的个性化方法,基于类似于静态用户标签的理念,但使其更具动态性和表现力。与其将用户归类为某个单一标签(如 “tech-savvy - 技术达人” 或 “healthy-conscious - 健康意识强”),稀疏向量可以表示多个偏好,并赋予不同的权重,而且这些权重可以直接整合进搜索排名过程。

使用 function_score 查询来融入用户偏好是一种灵活的个性化替代方案,但随着逻辑的复杂化,它可能变得难以维护。另一种常见的方法是协同过滤(collaborative filtering),它依赖外部系统来计算用户与商品之间的相似度,通常需要额外的基础设施支持。学习排序(LTR)也可以应用于个性化,具备强大的排序能力,但在特征工程和模型训练方面要求较高的成熟度。

总结

稀疏向量是你搜索工具箱中的一个多功能补充。我们只介绍了两个实际的例子:提升搜索结果和基于用户画像实现个性化。但它的应用范围非常广泛。

通过将结构化、加权的信息直接嵌入到文档中,你可以以最小的复杂度实现更智能、更相关的搜索体验。

Elasticsearch 拥有许多新功能,帮助你为特定用例构建最佳搜索解决方案。深入了解我们的示例笔记本,开始免费云试用,或者现在就试试在本地机器上运行 Elastic。

原文:Enhancing relevance with sparse vectors - Elasticsearch Labs

相关文章:

  • 修复 WPS 编译错误:缺少:Sub或Function 且出现两个MathType加载项
  • 生物化学笔记:医学免疫学原理15 超敏反应过敏反应(I型[蚊虫叮咬]+II型[新生儿溶血症、突眼型甲亢]+III型+IV型)
  • Ollama调用多GPU实现负载均衡
  • 知识产权——计算机软件著作权的归属
  • 利用MinGW编译OpenCV源码
  • 这几天的大风,咋回事呢?还有软件开发防护
  • instructor库实现batch 请求
  • 基础数学:图论与信息论
  • 前端性能测试工具 —— WebPageTest
  • AI——使用pandas
  • 深入解析嵌入模型Embedding :从理论到实践的全方位指南
  • 微服务的服务调用详解以及常见解决方案对比
  • 软件测试——测试概念
  • CCLK IE转EtherCAT凭借网关模块实现三菱PLC与汇川伺服精准通讯的实用案例​
  • 107.二叉树的层序遍历II- 力扣(LeetCode)
  • opencv(C++)用直方图统计像素
  • 动态多目标优化:基于可学习预测的动态多目标进化算法(DIP-DMOEA)求解CEC2018(DF1-DF14),提供MATLAB代码
  • pair与tuple
  • 缓存与数据库一致性:从问题到解决方案全解析
  • 04-微服务 面试题-mk
  • 在站点上新建网页/百度信息流推广技巧
  • 大连政府建设工程信息网站/seo的基本步骤包括哪些
  • 网站建设与维护心得/长沙百度关键词排名
  • 网站设计侵权/河北网站建设案例
  • 网站的空间是/免费十八种禁用网站
  • 魔域永恒网页游戏/广安seo外包