【lucene】實現knn

在 Lucene 中,可以通過 `KnnFloatVectorQuery` 和 `KnnFloatVectorField` 來實現 KNN(k-Nearest Neighbors)搜索。以下是具體介紹:

1. 功能原理

`KnnFloatVectorQuery` 是 Lucene 用于執行最近鄰搜索的查詢類,它可以在一個字段中搜索與目標向量最相似的 k 個向量。其核心是基于 HNSW(Hierarchical Navigable Small World)算法,構建圖索引以實現高效的近似最近鄰(Approximate Nearest Neighbor,ANN)搜索。

2. 代碼示例

2.1 索引向量字段

```java

import org.apache.lucene.document.Document;

import org.apache.lucene.document.KnnFloatVectorField;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.index.IndexWriterConfig;

import org.apache.lucene.store.Directory;

import org.apache.lucene.store.ByteBuffersDirectory;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

public class LuceneKNNExample {

? ? public static float[] generateFVector(int dim) {

? ? ? ? float[] vector = new float[dim];

? ? ? ? Random random = new Random();

? ? ? ? for (int i = 0; i < dim; i++) {

? ? ? ? ? ? vector[i] = random.nextFloat();

? ? ? ? }

? ? ? ? return vector;

? ? }

? ? public static void main(String[] args) throws IOException {

? ? ? ? Directory directory = new ByteBuffersDirectory();

? ? ? ? IndexWriterConfig config = new IndexWriterConfig(null);

? ? ? ? IndexWriter indexWriter = new IndexWriter(directory, config);

? ? ? ? int count = 10000;

? ? ? ? int dim = 128;

? ? ? ? List<Document> docs = new ArrayList<>();

? ? ? ? for (int i = 0; i < count; i++) {

? ? ? ? ? ? Document doc = new Document();

? ? ? ? ? ? doc.add(new KnnFloatVectorField("fvecs", generateFVector(dim)));

? ? ? ? ? ? docs.add(doc);

? ? ? ? }

? ? ? ? indexWriter.addDocuments(docs);

? ? ? ? indexWriter.commit();

? ? ? ? System.out.println("索引寫入成功");

? ? }

}

```

2.2 執行 KNN 查詢

```java

import org.apache.lucene.index.DirectoryReader;

import org.apache.lucene.index.IndexReader;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.TopDocs;

import org.apache.lucene.store.Directory;

import org.apache.lucene.util.BytesRef;

import java.io.IOException;

import java.nio.file.Path;

import java.util.Random;

public class KNNQueryExample {

? ? public static float[] generateFVector(int dim) {

? ? ? ? float[] vector = new float[dim];

? ? ? ? Random random = new Random();

? ? ? ? for (int i = 0; i < dim; i++) {

? ? ? ? ? ? vector[i] = random.nextFloat();

? ? ? ? }

? ? ? ? return vector;

? ? }

? ? public static void main(String[] args) throws IOException {

? ? ? ? Directory readDirectory = new ByteBuffersDirectory();

? ? ? ? IndexReader indexReader = DirectoryReader.open(readDirectory);

? ? ? ? IndexSearcher indexSearcher = new IndexSearcher(indexReader);

? ? ? ? float[] queryVector = generateFVector(128);

? ? ? ? int k = 3;

? ? ? ? TopDocs topDocs = indexSearcher.search(new KnnFloatVectorQuery("fvecs", queryVector, k), k);

? ? ? ? for (ScoreDoc scoreDoc : topDocs.scoreDocs) {

? ? ? ? ? ? System.out.println("doc: " + scoreDoc.doc + ", score: " + scoreDoc.score);

? ? ? ? }

? ? }

}

```

3. 查詢原理

- `KnnFloatVectorQuery` 的 rewrite 過程:在 rewrite 之后,`KnnFloatVectorQuery` 會變成 `DocAndScoreQuery`,它內部已經存儲了符合條件的 `docId` 和 `score`。

- HNSW 算法:HNSW 算法將新節點鏈接到 M 個最近鄰,通過反向鏈接和修剪來保留多樣性。M 值越大,精度越高,成本也越高。Beam-width 控制搜索范圍。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92577.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92577.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92577.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RabbitMQ實踐學習筆記

RabbitMQ實踐 以下是關于RabbitMQ實踐的整理,涵蓋常見場景和示例代碼(基于Markdown格式)。內容按模塊分類,避免步驟詞匯,直接提供可操作的方法: 基礎連接與隊列聲明 使用Python的pika庫建立連接并聲明隊列: import pikaconnection = pika.BlockingConnection(pika.C…

量子生成對抗網絡:量子計算與生成模型的融合革命

引言&#xff1a;當生成對抗網絡遇上量子計算在人工智能與量子計算雙重浪潮的交匯處&#xff0c;量子生成對抗網絡&#xff08;Quantum Generative Adversarial Networks, QGAN&#xff09;正成為突破經典算力瓶頸的關鍵技術。傳統生成對抗網絡&#xff08;GAN&#xff09;在圖…

VBA 多個選項,將選中的選項錄入當前選中的單元格

1、使用LISTBOX插件&#xff0c;選中后回車錄入 維護好數據&#xff0c;并新增一個activeX列表框插件 Private Sub Worksheet_SelectionChange(ByVal Target As Range)If Target.Count > 1 Then Exit SubIf Target.Row > 2 And Target.Row < 10 And Target.Column 2…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 主頁-微博點贊量Top6實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解主頁-微博點贊量Top6實現 視頻在線地址&…

SAP調用外部API

SAP需求將中文字符轉化為對應的拼音具體思路,由于sap中沒有將中文字符轉化為拼音的函數或方法類,則以http請求訪問外部服務器發布的API服務,然后獲取其返回值即可1.調用外部網站上提供的api缺點:免費次數有限,后需要充值這里是用www格式的json報文*&----------------------…

(12)機器學習小白入門YOLOv:YOLOv8-cls 模型微調實操

YOLOv8-cls 模型微調實操 (1)機器學習小白入門YOLOv &#xff1a;從概念到實踐 (2)機器學習小白入門 YOLOv&#xff1a;從模塊優化到工程部署 (3)機器學習小白入門 YOLOv&#xff1a; 解鎖圖片分類新技能 (4)機器學習小白入門YOLOv &#xff1a;圖片標注實操手冊 (5)機器學習小…

基于Matlab傳統圖像處理技術的車輛車型識別與分類方法研究

隨著計算機視覺和圖像處理技術的發展&#xff0c;車輛檢測與識別已經成為智能交通系統中的一個重要研究方向。傳統圖像處理方法通過對圖像進行預處理、特征提取、分類與識別&#xff0c;提供了一種無需復雜深度學習模型的解決方案。本研究基于MATLAB平臺&#xff0c;采用傳統圖…

未來趨勢:LeafletJS 與 Web3/AI 的融合

引言 LeafletJS 作為一個輕量、靈活的 JavaScript 地圖庫&#xff0c;以其模塊化設計和高效渲染能力在 Web 地圖開發中占據重要地位。隨著 Web3 和人工智能&#xff08;AI&#xff09;的興起&#xff0c;地圖應用的開發范式正在發生變革。Web3 技術&#xff08;如區塊鏈、去中…

Spring AI 系列之二十一 - EmbeddingModel

之前做個幾個大模型的應用&#xff0c;都是使用Python語言&#xff0c;后來有一個項目使用了Java&#xff0c;并使用了Spring AI框架。隨著Spring AI不斷地完善&#xff0c;最近它發布了1.0正式版&#xff0c;意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說…

LFU算法及優化

繼上一篇的LRU算法的實現和講解&#xff0c;這一篇來講述LFU最近使用頻率高的數據很大概率將會再次被使用,而最近使用頻率低的數據,將來大概率不會再使用。做法&#xff1a;把使用頻率最小的數據置換出去。這種算法更多是從使用頻率的角度&#xff08;但是當緩存滿時&#xff0…

關于原車一鍵啟動升級手機控車的核心信息及注意事項

想知道如何給原車已經有一鍵啟動功能的車輛加裝手機遠程啟動。這是個很實用的汽車改裝需求&#xff0c;尤其適合想在冬天提前熱車、夏天提前開空調的車主。一、適配方案與核心功能 ?升級專車專用4G手機控車模塊?&#xff0c;推薦安裝「移動管家YD361-3」系統&#xff0c;該方…

數據結構與算法:類C語言有關操作補充

數據結構與算法:類C語言操作補充 作為老師,我將詳細講解類C語言(如C或C++)中的關鍵操作,包括動態內存分配和參數傳遞。這些內容在數據結構與算法中至關重要,例如在實現動態數組、鏈表或高效函數調用時。我會用通俗易懂的語言和代碼示例逐步解釋,確保你輕松掌握。內容基…

Go 并發(協程,通道,鎖,協程控制)

一.協程&#xff08;Goroutine&#xff09;并發&#xff1a;指程序能夠同時執行多個任務的能力&#xff0c;多線程程序在一個核的cpu上運行&#xff0c;就是并發。并行&#xff1a;多線程程序在多個核的cpu上運行&#xff0c;就是并行。并發主要由切換時間片來實現"同時&q…

圖機器學習(15)——鏈接預測在社交網絡分析中的應用

圖機器學習&#xff08;15&#xff09;——鏈接預測在社交網絡分析中的應用0. 鏈接預測1. 數據處理2. 基于 node2vec 的鏈路預測3. 基于 GraphSAGE 的鏈接預測3.1 無特征方法3.2 引入節點特征4. 用于鏈接預測的手工特征5. 結果對比0. 鏈接預測 如今&#xff0c;社交媒體已成為…

每日一算:華為-批薩分配問題

題目描述"吃貨"和"饞嘴"兩人到披薩店點了一份鐵盤&#xff08;圓形&#xff09;披薩&#xff0c;并囑咐店員將披薩按放射狀切成大小相同的偶數個小塊。但是粗心的服務員將披薩切成了每塊大小都完全不同的奇數塊&#xff0c;且肉眼能分辨出大小。由于兩人都…

Transfusion,Show-o and Show-o2論文解讀

目錄 一、Transfusion 1、概述 2、方法 二、Show-o 1、概述 2、方法 3、訓練 三、Show-o2 1、概述 2、模型架構 3、訓練方法 4、實驗 一、Transfusion 1、概述 Transfusion模型應該是Show系列&#xff0c;Emu系列的前傳&#xff0c;首次將文本和圖像生成統一到單…

聊聊 Flutter 在 iOS 真機 Debug 運行出現 Timed out *** to update 的問題

最近剛好有人在問&#xff0c;他的 Flutter 項目在升級之后出現 Error starting debug session in Xcode: Timed out waiting for CONFIGURATION_BUILD_DIR to update 問題&#xff0c;也就是真機 Debug 時始終運行不了的問題&#xff1a; 其實這已經是一個老問題了&#xff0c…

《R for Data Science (2e)》免費中文翻譯 (第1章) --- Data visualization(2)

寫在前面 本系列推文為《R for Data Science (2)》的中文翻譯版本。所有內容都通過開源免費的方式上傳至Github&#xff0c;歡迎大家參與貢獻&#xff0c;詳細信息見&#xff1a; Books-zh-cn 項目介紹&#xff1a; Books-zh-cn&#xff1a;開源免費的中文書籍社區 r4ds-zh-cn …

【機器學習【9】】評估算法:數據集劃分與算法泛化能力評估

文章目錄一、 數據集劃分&#xff1a;訓練集與評估集二、 K 折交叉驗證&#xff1a;提升評估可靠性1. 基本原理1.1. K折交叉驗證基本原理1.2. 邏輯回歸算法與L22. 基于K折交叉驗證L2算法三、棄一交叉驗證&#xff08;Leave-One-Out&#xff09;1、基本原理2、代碼實現四、Shuff…

CodeBuddy三大利器:Craft智能體、MCP協議和DeepSeek V3,編程效率提升的秘訣:我的CodeBuddy升級體驗之旅(個性化推薦微服務系統)

&#x1f31f; 嗨&#xff0c;我是Lethehong&#xff01;&#x1f31f; &#x1f30d; 立志在堅不欲說&#xff0c;成功在久不在速&#x1f30d; &#x1f680; 歡迎關注&#xff1a;&#x1f44d;點贊??留言收藏&#x1f680; &#x1f340;歡迎使用&#xff1a;小智初學計…