【Elasticsearch】HNSW

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

HNSW的基本原理

  1. **层次结构**:
  • HNSW构建一个多层图结构,每一层都包含一个子集的节点。

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

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

  1. **搜索过程**:
  • 搜索从最高层开始,逐步向下层移动。

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

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

HNSW的主要参数

  1. **`m` 参数**:
  • **含义**:每个节点在HNSW图中的最大连接数。

  • **默认值**:16

  • **调优建议**:

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

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

  1. **`ef_construction` 参数**:
  • **含义**:在构建索引时,每个节点的候选邻居数量。

  • **默认值**:100

  • **调优建议**:

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

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

  1. **`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`值以减少索引大小。

  1. **`ef_construction` 参数**:
  • 如果构建时间不是主要关注点,可以增加`ef_construction`值以提高索引质量。

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

  1. **`ef_search` 参数**:
  • 如果搜索精度是关键,可以增加`ef_search`值以提高搜索精度。

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

总结

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

相关推荐
Elasticsearch1 天前
Elastic Observability 的跨项目搜索:通过一个查询搜索所有关联项目
elasticsearch
Elasticsearch1 天前
Elasticsearch 中的 agentic 工作流:暂停 AI agent 等待人工审批,72 小时后恢复
elasticsearch
Elastic 中国社区官方博客1 天前
jina-ocr-v1:在低成本 GPU 上实现更快速的文档解析
大数据·数据库·elasticsearch·搜索引擎·全文检索·jina
vx-程序开发2 天前
【计算机毕设】django校园跑腿服务系统83141
java·数据库·vue.js·spring boot·spring·elasticsearch·django
Elasticsearch2 天前
jina-ocr-v1:在低成本 GPU 上实现更快速的文档解析
elasticsearch
深海鱼肝油ya2 天前
向量数据库Elasticsearch(四)搜索文档——各种方式
人工智能·elasticsearch·向量数据库·es搜索文档·只能体·非结构化数据库
Elasticsearch2 天前
SNAP 支付错误检测:Elastic 如何帮助美国各州应对 FY2028 的处罚
elasticsearch
Elastic 中国社区官方博客2 天前
使用 Elasticsearch 和 Jina 进行 AI 视频搜索:精准找到你需要的视频片段秒数
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
Elasticsearch2 天前
2026 年唯一获得满分 Endpoint Prevention and Response(EPR)评分的是 Elastic
elasticsearch
Elasticsearch3 天前
没有小到无法记录的日志文件:Elastic Agent 如何跟踪低于 1 KiB 阈值的文件
elasticsearch