暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Elasticsearch 向量搜索实战:从基础到进阶

新智锦绣 2025-05-16
552

点击蓝字关注我们


在本文中,我们将深入探讨如何在 Elasticsearch 中设置向量搜索并执行 k-NN(k-最近邻)搜索。这是 Elasticsearch 向量搜索系列的第二篇文章,旨在帮助您掌握向量搜索的核心概念及其在 Elasticsearch 中的实现方式。


背景知识

尽管 Elasticsearch 直到 8.0 版本才通过 _knn_search API 端点支持向量搜索,但从 7.0 版本开始,Elasticsearch 就已经支持使用 dense_vector 字段类型存储向量。当时,向量仅作为二进制文档值存储,并未使用任何索引算法。这些 dense_vector 字段为 Elasticsearch 后续的向量搜索功能奠定了基础。


如何设置 k-NN 搜索

在 Elasticsearch 中,向量搜索是原生支持的,无需额外安装任何组件。我们只需要创建一个索引,并定义至少一个 dense_vector 类型的字段来存储和索引向量数据。

以下是一个 dense_vector 字段的映射示例,字段名为 title_vector,维度为 3:

    JSON
    {
      "mappings": {
        "properties": {
          "title_vector": {
            "type""dense_vector",
            "dims"3,
            "similarity""dot_product"
          }
        }
      }
    }

    在这个示例中,dense_vector 字段将使用我们在之前文章中介绍的 dot_product 相似度函数。


    精确搜索


    精确搜索是一种线性搜索,也称为暴力搜索。在这种模式下,查询向量将与每个存储的向量进行比较,以找到最近的邻居。由于向量不需要在 HNSW 图中索引,因此索引时间较短,但随着数据量的增加,搜索速度会显著下降。

    以下是一个使用 script_score 查询进行精确搜索的示例:

      JSON
      {
        "query": {
          "script_score": {
            "query": {
              "range": {
                "price": {
                  "gte"100
                }
              }
            },
            "script": {
              "source""cosineSimilarity(params.query_vector, 'title_vector')",
              "params": {
                "query_vector": [0.10.20.3]
              }
            }
          }
        }
      }


      近似 k-NN 搜索


      近似 k-NN 搜索是大多数情况下推荐使用的模式,尤其是在数据量较大的场景中。虽然索引时间较长,但搜索延迟较低,能够处理数百万甚至数十亿的向量数据。

      以下是一个简单的 k-NN 搜索示例:

        JSON
        {
          "knn": {
            "field""title_vector",
            "query_vector": [0.10.20.3],
            "k"2,
            "num_candidates"100
          }
        }

        在这个示例中,我们搜索与指定查询向量最接近的两个邻居。


        过滤 k-NN 搜索


        在 k-NN 搜索中,我们还可以指定过滤器来限制搜索范围。例如,以下查询仅搜索价格大于或等于 100 的文档:

          JSON
          {
            "knn": {
              "field""title_vector",
              "query_vector": [0.10.20.3],
              "k"2,
              "filter": {
                "range": {
                  "price": {
                    "gte"100
                  }
                }
              }
            }
          }


          k-NN 搜索的局限性


          尽管 k-NN 搜索功能强大,但仍有一些限制需要注意:

          • 在 8.11 版本之前,k-NN 搜索无法在嵌套文档中的向量字段上运行。

          • search_type 始终设置为 dfs_query_then_fetch,无法动态更改。

          • 由于 HNSW 算法的性质,返回的 k 个最近邻居并不总是真正的最近邻居。


          总结

          在本文中,我们详细介绍了 Elasticsearch 中的向量搜索功能。我们首先回顾了 Elasticsearch 向量搜索的背景,然后介绍了如何使用 script_score 查询进行精确搜索,以及如何使用 knn 搜索选项或 knn 查询进行近似 k-NN 搜索。

          我们还探讨了如何配置 knn 搜索选项和查询,包括使用过滤器和预期相似度,以及如何同时运行多个 k-NN 搜索。最后,我们列出了 k-NN 搜索的一些局限性,并建议您查看官方文档以优化 k-NN 搜索性能。

          如果您对本文内容感兴趣,请继续关注本系列的后续文章,我们将深入探讨如何结合词汇搜索和向量搜索,以及如何在 Elasticsearch 中简化语义搜索。



          关于公司

          感谢您关注新智锦绣科技(北京)有限公司!作为 Elastic 的 Elite 合作伙伴及 EnterpriseDB 在国内的唯一代理和服务合作伙伴,我们始终致力于技术创新和优质服务,帮助企业客户实现数据平台的高效构建与智能化管理。无论您是关注 Elastic 生态系统,还是需要 EnterpriseDB 的支持,我们都将为您提供专业的技术支持和量身定制的解决方案。


          欢迎关注我们,获取更多技术资讯和数字化转型方案,共创美好未来!

          Elastic 微信群

          EDB 微信群


          发现“分享”“赞”了吗,戳我看看吧





          文章转载自新智锦绣,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论