日韩欧美人妻无码精品白浆,夜夜嗨AV免费入口,国产欧美官网在线看,高校回应聋哑女生因长相完美被质疑

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

一文讀懂ES向量搜索:原理剖析與技術(shù)全景

freeflydom
2025年5月12日 9:53 本文熱度 579

注:本文若未說(shuō)明ES版本則為7.10,其他版本會(huì)特別標(biāo)記,由于ES版本不同,部分差異較大,具體請(qǐng)以官方文檔為準(zhǔn)

一、向量搜索的核心原理

1.1 向量化表示的本質(zhì)

現(xiàn)代AI技術(shù)將文本、圖像等非結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)化為高維向量(通常128-1024維),這些向量在數(shù)學(xué)空間中攜帶語(yǔ)義特征。如:

  • 文本嵌入(Embedding):BERT等模型生成768維向量
  • 圖像特征:ResNet提取2048維特征向量

1.2 向量搜索簡(jiǎn)介

向量搜索,簡(jiǎn)單來(lái)說(shuō),就是在向量空間中進(jìn)行的搜索操作。在傳統(tǒng)的文本搜索中,我們通?;陉P(guān)鍵詞進(jìn)行匹配,這種方式對(duì)于精確匹配的場(chǎng)景效果較好,但在處理語(yǔ)義理解、模糊匹配等復(fù)雜場(chǎng)景時(shí)顯得力不從心。而向量搜索則將文本、圖像、音頻等各種數(shù)據(jù)轉(zhuǎn)化為向量表示,通過(guò)計(jì)算向量之間的相似度來(lái)進(jìn)行搜索。這種方式能夠更好地捕捉數(shù)據(jù)的語(yǔ)義信息,從而實(shí)現(xiàn)更精準(zhǔn)、更智能的搜索。

例如,對(duì)于文本數(shù)據(jù),我們可以使用詞嵌入(Word Embedding)技術(shù)將每個(gè)單詞映射為一個(gè)向量,然后將整個(gè)文本的向量表示為其包含單詞向量的某種聚合(如平均、求和等)。在搜索時(shí),將查詢文本也轉(zhuǎn)化為向量,通過(guò)計(jì)算查詢向量與文檔向量之間的相似度,找出與查詢最相關(guān)的文檔。

二、Elasticsearch兩種核心向量搜索方式

Elasticsearch為了滿足向量搜索的需求,在7.0版本新增了兩個(gè)字段類型dense_vector 和 sparse_vector,分別是密集向量和稀疏向量,其中 sparse_vector在7.6中被棄用,在8.0-8.10版本中是沒有該字段類型的。

2.1 近似kNN(HNSW算法)

在7.10版本中,沒有該方式,因此按照2025/3/1最新版本8.17版本介紹.

k-nearest neighbor(kNN)搜索通過(guò)相似性度量所測(cè)量等算法查詢向量最近的k個(gè)向量。

前置條件

要使用KNN搜索,首先必須要有dense_vector或 sparse_vector字段,這些字段的維度一定要和查詢的維度相同,所以一定要確定好維度。關(guān)于向量,可以在Elasticsearch中使用自然語(yǔ)言處理(NLP)模型創(chuàng)建這些向量,或者在Elasticsearch外部生成它們,比如使用阿里云的向量模型API獲取文本向量后賦值到搜索參數(shù)中。

  1. 首先需要顯式映射一個(gè)或多個(gè)dense_vector字段。

在8.0版中添加了對(duì)近似kNN搜索的支持。在此之前,dense_vector字段不支持在映射中啟用索引。如果在8.0之前的版本創(chuàng)建了一個(gè)包含dense_vector字段的索引,那么為了支持近似kNN搜索,必須使用設(shè)置index:true(默認(rèn)選項(xiàng))的新字段映射重新索引數(shù)據(jù)。

PUT image-index
{
  "mappings": {
    "properties": {
      "image-vector": {
        "type": "dense_vector",
        "dims": 3,       //向量維度
        "index": true,   //8.0之前使用KNN搜索
        "similarity": "l2_norm"  //獲取knn相似度的函數(shù),不設(shè)置改值默認(rèn)為cosine(余弦),且只能在index設(shè)置為true時(shí)指定
      },
      "title-vector": {
        "type": "dense_vector",
        "dims": 5,
        "similarity": "l2_norm"
      },
      "title": {
        "type": "text"
      },
      "file-type": {
        "type": "keyword"
      }
    }
  }
}

similarity的選擇有(詳情可看密集向量字段的參數(shù)):

  • l2_norm
  • dot_product
  • cosine
  • max_inner_product
  1. 創(chuàng)建數(shù)據(jù)
POST image-index/_bulk?refresh=true
{ "index": { "_id": "1" } }
{ "image-vector": [1, 5, -20], "title-vector": [12, 50, -10, 0, 1], "title": "moose family", "file-type": "jpg" }
{ "index": { "_id": "2" } }
{ "image-vector": [42, 8, -15], "title-vector": [25, 1, 4, -12, 2], "title": "alpine lake", "file-type": "png" }
{ "index": { "_id": "3" } }
{ "image-vector": [15, 11, 23], "title-vector": [1, 5, 25, 50, 20], "title": "full moon", "file-type": "jpg" }
...
  1. 使用knn選項(xiàng)或knn查詢
POST image-index/_search
{
  "knn": {
    "field": "image-vector",
    "query_vector": [-5, 9, -12],
    "k": 10, //查詢的數(shù)量
    "num_candidates": 100
  },
  "fields": [ "title", "file-type" ]
}
  1. 原理

為了收集結(jié)果,kNN搜索API在每個(gè)分片上找到num_candidates數(shù)量的近似最近鄰候選。搜索計(jì)算這些候選向量與查詢向量的相似度,選擇k個(gè)最相似的結(jié)果。然后,搜索將來(lái)自 每個(gè)分片返回全局前k個(gè)最近鄰向量。

可以增加num_candidates以獲得更準(zhǔn)確的結(jié)果,但代價(jià)是搜索速度變慢。num_candidates值比較較高的搜索 會(huì)從每個(gè)分片中考慮更多的候選者。會(huì)花費(fèi)更多的時(shí)間,但也會(huì)提高搜索真正的k個(gè)最接近的向量的概率。

2.2精確暴力搜索

計(jì)算查詢向量與所有過(guò)濾后的文檔向量的余弦/歐式距離,保證100%召回率但計(jì)算成本高。使用精確KNN搜索的話,需要使用帶有vector函數(shù)的script_score查詢。

  1. 首先需要顯式映射一個(gè)或多個(gè)dense_vector字段。如果不打算將該字段使用近似kNN搜索,可以將索引映射選項(xiàng)設(shè)置為false。這可以顯著提高索引速度。
PUT product-index
{
  "mappings": {
    "properties": {
      "product-vector": {
        "type": "dense_vector",
        "dims": 5,
        "index": false
      },
      "price": {
        "type": "long"
      }
    }
  }
}
  1. 創(chuàng)建數(shù)據(jù)
POST product-index/_bulk?refresh=true
{ "index": { "_id": "1" } }
{ "product-vector": [230.0, 300.33, -34.8988, 15.555, -200.0], "price": 1599 }
{ "index": { "_id": "2" } }
{ "product-vector": [-0.5, 100.0, -13.0, 14.8, -156.0], "price": 799 }
{ "index": { "_id": "3" } }
{ "product-vector": [0.5, 111.3, -13.0, 14.8, -156.0], "price": 1099 }
...
  1. 使用search API運(yùn)行包含向量函數(shù)script_score查詢。
    向量函數(shù)的類型有:
    1. cosineSimilarity-計(jì)算余弦相似度
    2. dotProduct-計(jì)算點(diǎn)積
    3. l1 norm-計(jì)算L1距離
    4. Hamming-計(jì)算Hamming距離
    5. l2 norm-計(jì)算L2距離
    6. doc[<field>].vectorValue-以浮點(diǎn)數(shù)組的形式返回向量的值
    7. doc[<field>].magnitude-返回向量的大小
      接下來(lái)以cosineSimilarity為例,這是一個(gè)通過(guò)計(jì)算兩個(gè)向量的余弦大小來(lái)判斷向量相似度的函數(shù)。我們通過(guò)傳入的參數(shù)向量queryVector,這個(gè)名稱是自定義的,但是需要與source的腳本中params.queryVector一致,下面方法將會(huì)查詢所有文檔
POST product-index/_search
{
  "query": {
    "script_score": {
      "query" : {
        "match_all" : {}
       },
      "script": {
        "source": "cosineSimilarity(params.queryVector, 'product-vector') + 1.0",
        "params": {
          "queryVector": [-0.5, 90.0, -10, 14.8, -156.0]
        }
      }
    }
  }
}

但是使用match_all查詢來(lái)全量匹配所有文檔會(huì)顯著增加搜索延遲,為了限制傳遞給vector函數(shù)的匹配文檔的數(shù)量,可以在script_score.query參數(shù)中指定一個(gè)過(guò)濾查詢。例如下面示例:

POST product-index/_search
{
  "query": {
    "script_score": {
      "query" : {
        "bool" : {
          "filter" : {
            "range" : {
              "price" : {
                "gte": 1000
              }
            }
          }
        }
      },
      "script": {
        "source": "cosineSimilarity(params.queryVector, 'product-vector') + 1.0",
        "params": {
          "queryVector": [-0.5, 90.0, -10, 14.8, -156.0]
        }
      }
    }
  }
}

2.3 兩種搜索的對(duì)比

原理差異

  • 精確暴力搜索:在進(jìn)行搜索時(shí),精確暴力搜索會(huì)遍歷數(shù)據(jù)集中的每一個(gè)向量,逐一計(jì)算查詢向量與它們之間的相似度(如歐幾里得距離、余弦相似度等),然后根據(jù)相似度的大小對(duì)所有向量進(jìn)行排序,最后選取最相似的k個(gè)向量作為結(jié)果返回。這種方法簡(jiǎn)單直接,能夠保證搜索結(jié)果的精確性,但在數(shù)據(jù)量較大時(shí),計(jì)算量會(huì)非常龐大。
  • 近似 k - NN 搜索:近似 k - NN 搜索則采用了一些優(yōu)化策略來(lái)減少計(jì)算量。例如,利用上述提到的 KD - Tree、HNSW 等索引結(jié)構(gòu),通過(guò)構(gòu)建數(shù)據(jù)的層次化表示或圖結(jié)構(gòu),在搜索時(shí)能夠快速定位到可能包含相似向量的區(qū)域,而無(wú)需遍歷整個(gè)數(shù)據(jù)集。以 HNSW 為例,它通過(guò)多層圖結(jié)構(gòu),在高層圖中快速跳過(guò)大量不相關(guān)的向量,僅在底層圖中對(duì)局部區(qū)域進(jìn)行更精確的搜索,從而在保證一定搜索精度的前提下,大大提高了搜索效率。

性能表現(xiàn)

  • 搜索時(shí)間:精確暴力搜索的搜索時(shí)間與數(shù)據(jù)集的大小成正比,數(shù)據(jù)量越大,搜索時(shí)間越長(zhǎng)。在大規(guī)模數(shù)據(jù)集上,搜索可能需要很長(zhǎng)時(shí)間才能完成。而近似 k - NN 搜索借助索引結(jié)構(gòu),能夠顯著減少搜索過(guò)程中需要計(jì)算相似度的向量數(shù)量,搜索時(shí)間相對(duì)較短,尤其在處理海量數(shù)據(jù)時(shí),優(yōu)勢(shì)更為明顯。
  • 內(nèi)存使用:精確暴力搜索不需要額外的內(nèi)存來(lái)存儲(chǔ)索引結(jié)構(gòu),僅需存儲(chǔ)數(shù)據(jù)集本身。然而,近似 k - NN 搜索需要構(gòu)建和維護(hù)索引結(jié)構(gòu),這會(huì)占用額外的內(nèi)存空間。例如,HNSW 索引在構(gòu)建過(guò)程中會(huì)生成多層圖結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都需要存儲(chǔ)一定的連接信息,因此會(huì)消耗更多的內(nèi)存。

適用場(chǎng)景

  • 精確暴力搜索:適用于數(shù)據(jù)集較小、對(duì)搜索結(jié)果的精確性要求極高且對(duì)搜索時(shí)間沒有嚴(yán)格限制的場(chǎng)景。例如,在一些數(shù)據(jù)量有限的科研項(xiàng)目中,研究人員可能更關(guān)注搜索結(jié)果的準(zhǔn)確性,而不太在意搜索時(shí)間,此時(shí)精確暴力搜索可以滿足需求。
  • 近似 k - NN 搜索:在實(shí)際應(yīng)用中,尤其是面對(duì)大規(guī)模數(shù)據(jù)集時(shí),近似 k - NN 搜索更為適用。例如,在圖像搜索引擎中,可能需要處理數(shù)百萬(wàn)甚至數(shù)十億張圖像的向量數(shù)據(jù),如果使用精確暴力搜索,搜索效率將極低。而近似 k - NN 搜索能夠在較短的時(shí)間內(nèi)返回近似最優(yōu)的結(jié)果,滿足用戶對(duì)實(shí)時(shí)性的需求
  1. 用精確搜索的情況
  • 公司只有200份合同,需要100%確保找到所有相關(guān)文件
  • 醫(yī)療診斷系統(tǒng),不能容忍任何漏診可能
  1. 用近似搜索的情況
  • 淘寶有10億商品圖片,用戶想快速找到相似款衣服
  • 抖音推薦視頻,允許少量誤差但要求毫秒級(jí)響應(yīng)

精確的強(qiáng)力kNN保證了準(zhǔn)確的結(jié)果,但無(wú)法很好地?cái)U(kuò)展大型數(shù)據(jù)集。如果必須要使用精確暴力搜索,您可以通過(guò)使用查詢參數(shù)來(lái)限制傳遞給函數(shù)的匹配文檔的數(shù)量。如果過(guò)濾數(shù)據(jù)到一個(gè)小的文檔子集,就可以得到很好的搜索結(jié)果。

三、Elasticsearch支持的其他語(yǔ)義搜索方式

Elasticsearch使用自然語(yǔ)言處理(NLP)和向量搜索提供各種語(yǔ)義搜索功能。使用NLP模型使您能夠從文本中提取文本嵌入。嵌入是提供文本的數(shù)字表示的向量。具有相似含義的內(nèi)容片段具有相似的表示。

Elasticsearch中的semantic_text字段也支持語(yǔ)義文本搜索。在使用時(shí)只需要將文檔的字段設(shè)置為semantic_text, 不需要指定如何為數(shù)據(jù)生成嵌入,或者如何對(duì)其進(jìn)行索引。推理端點(diǎn)自動(dòng)確定要使用的嵌入生成,索引和查詢。
image

翻譯 警告:此功能處于測(cè)試階段,可能會(huì)發(fā)生變化。設(shè)計(jì)和代碼不如官方GA功能成熟,并且按原樣提供,沒有任何保證。Beta版功能不受正式GA功能的支持SLA的限制。使用時(shí)需要注意風(fēng)險(xiǎn)

使用

  1. 創(chuàng)建Index Mapping
    默認(rèn)是使用預(yù)配置的.elser-2-elasticsearch端點(diǎn),使用以下API請(qǐng)求設(shè)置semantic_text
PUT semantic-embeddings
{
  "mappings": {
    "properties": {
      "content": {
        "type": "semantic_text"
        //"inference_id": "my-elser-endpoint", 默認(rèn)是使用預(yù)配置的``.elser-2-elasticsearch``端點(diǎn),也可以自己設(shè)置推理端點(diǎn)
      }
    }
  }
}
  1. 加載數(shù)據(jù)
    將文檔添加到索引時(shí),Elasticsearch 會(huì)自動(dòng)使用指定的推理端點(diǎn)計(jì)算嵌入,并將其存儲(chǔ)在 semantic_text 字段中。您無(wú)需手動(dòng)生成嵌入向量。以下是索引文檔的示例:
PUT semantic-embeddings/_doc/1
{
  "content": "Elasticsearch 8.17 introduces semantic search capabilities."
}
  1. 語(yǔ)義搜索
GET semantic-embeddings/_search
{
  "query": {
    "semantic": {
      "field": "content",
      "query": "如何在跑步時(shí)避免肌肉酸痛?"
    }
  }
}

使用嵌入豐富數(shù)據(jù)集之后,可以使用語(yǔ)義搜索查詢數(shù)據(jù)。在語(yǔ)義查詢類型中提供semantic_text字段名稱和查詢文本。用于為semantic_text字段生成嵌入的推理端點(diǎn)將用于處理查詢文本。

通過(guò)上述步驟,您可以在 Elasticsearch 8.17 中利用 semantic_text 字段實(shí)現(xiàn)高效的語(yǔ)義搜索功能。該功能使搜索更加智能,能夠理解查詢的意圖和上下文,從而提供更相關(guān)的搜索結(jié)果。

向量搜索典型應(yīng)用場(chǎng)景

  • 基于自然語(yǔ)言處理(NLP)算法的相關(guān)性排序
  • 產(chǎn)品推薦和推薦引擎
  • 圖像或視頻的相似性搜索

轉(zhuǎn)自https://www.cnblogs.com/renyi537/p/18867146


該文章在 2025/5/12 9:53:53 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved