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

【Elasticsearch】HNSW

 HNSW(Hierarchical Navigable Small World)是一种高效的近似最近邻(Approximate Nearest Neighbor, ANN)搜索算法。它在大规模数据集上表现尤为出色,能够在保持高搜索精度的同时,显著提高搜索速度。HNSW通过构建多层图结构来加速搜索过程,使得在大规模数据集上进行k-最近邻搜索成为可能。

 

### HNSW的基本原理

 

1. **层次结构**:

   - HNSW构建一个多层图结构,每一层都包含一个子集的节点。

   - 最高层(Layer 0)包含所有节点,而较低的层逐渐减少节点数量。

   - 每个节点在不同层之间有连接,形成一个层次化的网络。

 

2. **搜索过程**:

   - 搜索从最高层开始,逐步向下层移动。

   - 在每层中,搜索算法会找到当前节点的最近邻节点,并继续向下一层搜索。

   - 通过这种方式,搜索过程可以快速缩小搜索范围,最终在最低层找到最接近的邻居。

 

### HNSW的主要参数

 

1. **`m` 参数**:

   - **含义**:每个节点在HNSW图中的最大连接数。

   - **默认值**:16

   - **调优建议**:

     - 较小的`m`值可以减少索引的大小,但可能会降低搜索精度。

     - 较大的`m`值可以提高搜索精度,但会增加索引的大小和构建时间。

 

2. **`ef_construction` 参数**:

   - **含义**:在构建索引时,每个节点的候选邻居数量。

   - **默认值**:100

   - **调优建议**:

     - 较大的`ef_construction`值可以提高索引的质量,但会增加索引构建时间。

     - 较小的`ef_construction`值可以加快索引构建速度,但可能会降低索引质量。

 

3. **`ef_search` 参数**:

   - **含义**:在搜索时,每个节点的候选邻居数量。

   - **默认值**:100

   - **调优建议**:

     - 较大的`ef_search`值可以提高搜索精度,但会增加搜索时间。

     - 较小的`ef_search`值可以加快搜索速度,但可能会降低搜索精度。

 

### 在Elasticsearch中使用HNSW

 

在Elasticsearch中,你可以通过设置 `index_options` 来使用HNSW索引方法。以下是一个示例,展示了如何创建一个使用HNSW索引的索引,并进行kNN搜索。

 

#### 1. 创建索引

 

```json

PUT my-hnsw-index

{

  "mappings": {

    "properties": {

      "my_vector": {

        "type": "dense_vector",

        "dims": 3,

        "index": true,

        "index_options": {

          "type": "hnsw",

          "m": 32,

          "ef_construction": 200

        }

      }

    }

  }

}

```

 

#### 2. 索引文档

 

```python

from elasticsearch import Elasticsearch

 

es = Elasticsearch()

 

# 生成随机向量

vector = [0.1, 0.2, 0.3]

 

# 索引文档

doc = {

    "my_vector": vector

}

es.index(index="my-hnsw-index", id=1, body=doc)

```

 

#### 3. 使用kNN搜索

 

```json

GET my-hnsw-index/_search

{

  "size": 10,

  "query": {

    "knn": {

      "my_vector": {

        "vector": [0.1, 0.2, 0.3], # 查询向量

        "k": 10,

        "ef_search": 200 # 调整ef_search值

      }

    }

  }

}

```

 

### 调优建议

 

1. **`m` 参数**:

   - 如果数据集较大,可以适当增加`m`值以提高搜索精度。

   - 如果存储空间有限,可以适当减小`m`值以减少索引大小。

 

2. **`ef_construction` 参数**:

   - 如果构建时间不是主要关注点,可以增加`ef_construction`值以提高索引质量。

   - 如果需要快速构建索引,可以适当减小`ef_construction`值。

 

3. **`ef_search` 参数**:

   - 如果搜索精度是关键,可以增加`ef_search`值以提高搜索精度。

   - 如果需要快速搜索,可以适当减小`ef_search`值。

 

### 总结

 

HNSW是一种高效的近似最近邻搜索算法,通过构建多层图结构来加速搜索过程。在Elasticsearch中,你可以通过设置 `index_options` 来使用HNSW索引方法,并通过调整 `m`、`ef_construction` 和 `ef_search` 参数来优化索引和搜索性能。通过这些调优建议,你可以在大规模数据集上实现高效且准确的k-最近邻搜索。


http://www.kler.cn/a/515836.html

相关文章:

  • 如何给自己的域名配置免费的HTTPS How to configure free HTTPS for your domain name
  • leetcode 121. 买卖股票的最佳时机
  • 7.8 ChatGPT 开发者模式实战:第三方天气查询平台对接,如何打造爆款天气应用?
  • 【C】本地变量与全局变量
  • QT调用OpenSceneGraph
  • Redis支持数据类型详解
  • 鸿蒙模块概念和应用启动相关类(HAP、HAR、HSP、AbilityStage、UIAbility、WindowStage、window)
  • 无人机图传模块:深入理解其工作原理与实际效用
  • 【Spring Boot】Spring原理:Bean的作用域和生命周期
  • 使用傅里叶变换进行图像边缘检测
  • 华为小米vivo向上,苹果荣耀OPPO向下
  • Haskell语言的区块链
  • Kotlin语言的数据结构
  • 大数据学习(40)- Flink执行流
  • 【面试总结】FFN(前馈神经网络)在Transformer模型中先升维再降维的原因
  • 如何在WordPress中轻松创建Mega菜单
  • MySQL分区表:万字详解与实践指南
  • 码随想录算法训练营Day13 | 二叉树的各种遍历
  • Android设备:Linux远程lldb调试
  • Avalonia:C# 跨平台桌面应用的优秀选择
  • Android Audio音频系统
  • solidity基础 -- 存储类型
  • 快速入门Flink
  • 电子电气架构 --- 智能电动汽车电子与其软件架构
  • 隐藏php版本信息x-powered-by
  • 【Uniapp-Vue3】setTabBar设置TabBar和下拉刷新API