在Elasticsearch(ES)最新版本(目前8.x系列)中,無需額外的“embedding插件”,因為ES從7.14版本開始就原生支持向量數據類型(dense_vector
) 和向量搜索能力,可直接作為向量庫使用。其核心功能是存儲、索引和搜索高維向量(如文本embedding、圖像特征等),常用于語義搜索、推薦系統等場景。
一、核心概念與前提
- 向量(Vector):這里指高維浮點數組(如文本經BERT模型轉換的768維embedding),用于量化表示數據的語義/特征。
dense_vector
類型:ES中用于存儲向量的字段類型,支持高維向量(最大維度取決于版本,8.x支持至2048維)。- 向量搜索:通過計算向量間的相似度(如余弦相似度、歐氏距離),找到與目標向量最相似的結果(kNN搜索)。
二、作為向量庫的使用步驟
1. 定義索引映射(Mapping)
首先創建一個包含dense_vector
字段的索引,用于存儲向量數據。例如,存儲“文本+embedding”的索引:
PUT /text_embeddings
{"mappings": {"properties": {"text": { "type": "text" }, // 原始文本"embedding": { // 向量字段"type": "dense_vector","dims": 768, // 向量維度(需與實際embedding維度一致,如BERT的768維)"index": true, // 開啟索引(用于向量搜索)"similarity": "cosine" // 相似度計算方式(cosine/euclidean/l2_norm,默認l2_norm)}}}
}
dims
:必須與embedding的維度一致(如768、1024等)。similarity
:指定默認相似度算法(余弦相似度最常用于語義匹配)。index: true
:啟用向量索引(基于HNSW算法的近似kNN搜索),提升搜索性能。
2. 插入帶向量的數據
將文本通過embedding模型(如BERT、Sentence-BERT)轉換為向量后,存入ES:
POST /text_embeddings/_doc/1
{"text": "Elasticsearch是一個分布式搜索引擎","embedding": [0.123, 0.456, ..., 0.789] // 768維向量(省略部分維度)
}POST /text_embeddings/_doc/2
{"text": "向量搜索用于語義匹配","embedding": [0.234, 0.567, ..., 0.890] // 另一768維向量
}
注意:向量需由外部模型生成(ES不負責文本→向量的轉換),常見工具如Python的
sentence-transformers
庫。
3. 執行向量搜索(kNN搜索)
給定一個查詢文本,先通過相同的embedding模型轉換為向量,再在ES中搜索最相似的向量:
GET /text_embeddings/_search
{"knn": {"field": "embedding", // 向量字段名"query_vector": [0.111, 0.222, ..., 0.333], // 查詢文本的embedding向量"k": 3, // 返回最相似的3個結果"num_candidates": 100 // 候選集大小(影響精度和性能,建議為k的10-100倍)},"fields": ["text"] // 只返回原始文本字段
}
- 結果解釋:ES會計算
query_vector
與索引中所有向量的相似度(按similarity
指定的算法),返回Top 3最相似的文檔。 - 精確搜索:若需精確計算(非近似),可使用
script_score
結合向量函數(但性能較差,適合小數據量):
GET /text_embeddings/_search
{"query": {"script_score": {"query": { "match_all": {} },"script": {"source": "cosineSimilarity(params.query_vector, 'embedding') + 1.0","params": {"query_vector": [0.111, 0.222, ..., 0.333]}}}}
}
三、核心原理過程
1. 向量存儲原理
dense_vector
字段將向量以浮點數組形式存儲,與其他字段(如文本、數字)共同構成文檔。- 當
index: true
時,ES會為向量構建近似最近鄰(ANN)索引,基于HNSW(Hierarchical Navigable Small World)算法:- HNSW通過構建多層“導航圖”,加速向量相似度計算,避免全量比對(全量比對在高維、大數據量下性能極差)。
- 索引過程中,向量會被插入到圖中,每層保留部分鄰居節點,查詢時通過上層導航快速定位候選節點,再在下層精確篩選。
2. 向量搜索原理
- 查詢向量生成:用戶輸入的查詢文本(或其他數據)通過embedding模型轉換為與存儲向量同維度的向量。
- 近似匹配:ES使用HNSW索引,從查詢向量出發,在導航圖中快速找到
num_candidates
個候選向量(候選集)。 - 精確計算:對候選集中的向量,按指定的相似度算法(如余弦)計算精確得分。
- 結果返回:按得分排序,返回Top k個最相似的文檔。
3. 與embedding模型的協同流程
完整的“文本語義搜索”流程如下:
原始文本 → (embedding模型)→ 向量 → 存入ES(dense_vector字段)↑ ↓
查詢文本 → (同一embedding模型)→ 查詢向量 → ES向量搜索 → 相似文本結果
- 關鍵:查詢向量與存儲向量必須來自同一embedding模型,否則向量空間不兼容,相似度無意義。
四、最新版本的優化(8.x)
- 更高維度支持:從早期版本的1024維提升至2048維,適配更大模型的embedding。
- 性能優化:HNSW索引的構建和查詢效率提升,支持更大規模的向量數據(千萬級以上)。
- 混合搜索:可同時結合向量搜索與傳統文本搜索(如
match
查詢),例如“語義相似且包含特定關鍵詞”。
總結
ES最新版本通過dense_vector
字段和kNN搜索原生支持向量存儲與檢索,無需額外插件。其核心是利用HNSW算法實現高效的近似向量匹配,常與外部embedding模型結合,用于語義搜索等場景。使用時需注意向量維度一致性和相似度算法的選擇,以保證搜索效果。