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

相关推荐
学习星球1 小时前
AI Agent 成本工程实战:从 OpenAI Codex 的 8 个“烧 Token“Bug 学起
人工智能·设计模式·微信小程序
Elasticsearch3 小时前
仪表板活动日志:了解哪些 Kibana 仪表板会被使用
elasticsearch
一点一木3 小时前
🚀 2026 年 8 月 GitHub 十大热门项目排行榜 🔥
人工智能·github
ssshooter3 小时前
现在网页都能提供 MCP 了?!
前端·人工智能·程序员
京东云开发者3 小时前
Claude Code vs Codex 记忆体系深度对比
人工智能
SelectDB3 小时前
为什么 JSON 正在成为分析数据库新的竞争点?
数据库·json·agent
ClouGence4 小时前
开源数据库管理工具 CloudDM 4.2.0 发布,新增 GoldenDB、KingbaseES 等数据源
数据库·dba·devops
不加辣椒4 小时前
第 4 章 什么是 Harness Engineering
人工智能
桃西西呀4 小时前
上下文窗口都卷到 100 万了,大模型为什么还在为"位置"发愁?
人工智能·llm·ai编程
阿拉斯攀登4 小时前
SpringBoot整合MQTT:后端订阅设备数据、解析传感器报文
人工智能