亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

向量數(shù)據(jù)庫之如何使用Elasticsearch實(shí)現(xiàn)向量數(shù)據(jù)存儲(chǔ)與搜索

 更新時(shí)間:2023年06月02日 11:03:38   作者:馬超的博客  
這篇文章主要介紹了向量數(shù)據(jù)庫之如何使用Elasticsearch實(shí)現(xiàn)向量數(shù)據(jù)存儲(chǔ)與搜索,在向量函數(shù)的計(jì)算過程中,會(huì)對(duì)所有匹配的文檔進(jìn)行線性掃描,因此,查詢預(yù)計(jì)時(shí)間會(huì)隨著匹配文檔的數(shù)量線性增長,本文給大家講解的非常詳細(xì),需要的朋友參考下吧

Here’s the table of contents:

向量數(shù)據(jù)庫:使用Elasticsearch實(shí)現(xiàn)向量數(shù)據(jù)存儲(chǔ)與搜索

一、簡介

  Elasticsearch在7.x的版本中支持 向量檢索 。在向量函數(shù)的計(jì)算過程中,會(huì)對(duì)所有匹配的文檔進(jìn)行線性掃描。因此,查詢預(yù)計(jì)時(shí)間會(huì)隨著匹配文檔的數(shù)量線性增長。出于這個(gè)原因,建議使用查詢參數(shù)來限制匹配文檔的數(shù)量(類似二次查找的邏輯,先使用match query檢索到相關(guān)文檔,然后使用向量函數(shù)計(jì)算文檔相關(guān)度)。

  訪問dense_vector的推薦方法是通過cosinessimilarity, dotProduct, 1norm或l2norm函數(shù)。但是需要注意,每個(gè)DSL腳本只能調(diào)用這些函數(shù)一次。例如,不要在循環(huán)中使用這些函數(shù)來計(jì)算文檔向量和多個(gè)其他向量之間的相似性。如果需要該功能,可以通過直接訪問向量值來重新實(shí)現(xiàn)這些函數(shù)。

二、實(shí)驗(yàn)前準(zhǔn)備

2.1 創(chuàng)建索引設(shè)置向量字段

  創(chuàng)建一個(gè)支持向量檢索的mapping,字段類型為dense_vector。

// 7.x 支持的 dims 最大為 1024。
PUT index3
{
  "mappings": {
    "properties": {
      "my_vector": {
        "type": "dense_vector",
        "dims": 3
      },
      "my_text" : {
        "type" : "keyword"
      }
    }
  }
}

2.2 寫入數(shù)據(jù)

PUT index3/_doc/1
{
  "my_text" : "text1",
  "my_vector" : [0.5, 10, 6]
}
PUT index3/_doc/2
{
  "my_text" : "text2",
  "my_vector" : [-0.5, 10, 10]
}

三、向量計(jì)算函數(shù)

3.1 余弦相似度:cosineSimilarity

  cosinessimilarity函數(shù)計(jì)算給定查詢向量和文檔向量之間的余弦相似性度量。

POST index3/_search
{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": "cosineSimilarity(params.queryVector, doc['my_vector'])+1.0",
        "params": {
          "queryVector": [-0.5, 10, 6]
        }
      }
    }
  }
}
  • 要限制script_score計(jì)算的文檔數(shù)量,需要提供一個(gè)過濾器 (query)。
  • script腳本在cosineSimilarity上增加了1.0,以防止得分為負(fù)。
  • 為了更好的利用DSL優(yōu)化器,可以使用參數(shù)的方式提供一個(gè)查詢向量。
  • 檢查缺失值:如果文檔中沒有用于執(zhí)行向量函數(shù)的向量字段的值,會(huì)拋出錯(cuò)誤。
  • 可以使用doc['my_vector'].size() == 0來檢查文檔是否有my_vector字段的值。

腳本樣例:

"source": 
"
doc['my_vector'].size() == 0 ? 0 : 
cosineSimilarity(params.queryVector, 'my_vector')
"

  如果文檔的dense_vector字段與查詢的向量維度不同,就會(huì)拋出異常。

3.2 計(jì)算點(diǎn)積:dotProduct

  dotProduct函數(shù)計(jì)算給定查詢向量和文檔向量之間的點(diǎn)積度量。

POST index3/_search
{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": """
        double value = dotProduct(params.queryVector,doc['my_vector']);
        return sigmoid(1, Math.E, -value);
        """,
        "params": {
          "queryVector": [
            -0.5,
            10,
            6
          ]
        }
      }
    }
  }
}

使用標(biāo)準(zhǔn)的sigmoid函數(shù)可以防止分?jǐn)?shù)為負(fù)。

3.3 曼哈頓距離:l1norm

  l1norm函數(shù)計(jì)算給定查詢向量和文檔向量之間的L1距離(曼哈頓距離)。

POST index3/_search
{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source":"1 / (1 + l1norm(params.queryVector, doc['my_vector']))",
        "params": {
          "queryVector": [-0.5, 10, 6]
        }
      }
    }
  }
}

1.與表示相似性的余弦相似度不同,1norml2norm表示距離或差異。這意味著,向量越相似,由1norml2norm函數(shù)產(chǎn)生的分?jǐn)?shù)就越低。因此,當(dāng)我們需要相似的向量來獲得更高的分?jǐn)?shù)時(shí),我們將1norml2norm的輸出反過來。另外,為了避免在文檔向量與查詢完全匹配時(shí)被除0,在分母中加了1。

3.4 歐幾里得距離:l2norm

  l2norm函數(shù)計(jì)算給定查詢向量和文檔向量之間的L2距離(歐幾里德距離)。

POST index3/_search
{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": "1 / (1 + l2norm(params.queryVector, doc['my_vector']))",
        "params": {
          "queryVector": [
            -0.5,
            10,
            6
          ]
        }
      }
    }
  }
}

3.5 自定義計(jì)算函數(shù)

  使用函數(shù)訪問向量的值,自定義實(shí)現(xiàn)向量余弦相似度計(jì)算。ES 中向量檢索 doc[].vectorValue 函數(shù)是在 Elasticsearch 7.8.0 版本開始支持的,在ES 7.5.1 或 7.8.0 以下版本會(huì)運(yùn)行失敗。

  可以通過以下函數(shù)直接訪問向量值:

  • doc[<field>].vectorValue – 以浮點(diǎn)數(shù)數(shù)組的形式返回向量的值。
  • doc[<field>].magnitude – 將向量的大小作為浮點(diǎn)數(shù)返回(對(duì)于7.5版本之前創(chuàng)建的向量,其向量的大小不會(huì)被存儲(chǔ))。所以這個(gè)函數(shù)每次被調(diào)用時(shí)都會(huì)進(jìn)行重新計(jì)算。
POST index3/_search
{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": """
          float[] v = doc['my_vector'].vectorValue;
          float vm = doc['my_vector'].magnitude;
          float dotProduct = 0;
          for (int i = 0; i < v.length; i++) {
            dotProduct += v[i] * params.queryVector[i];
          }
          return dotProduct / (vm * (float) params.queryVectorMag);
        """,
        "params": {
          "queryVector": [
            -0.5,
            10,
            6
          ],
          "queryVectorMag": 5.25357
        }
      }
    }
  }
}

到此這篇關(guān)于向量數(shù)據(jù)庫之如何使用Elasticsearch實(shí)現(xiàn)向量數(shù)據(jù)存儲(chǔ)與搜索的文章就介紹到這了,更多相關(guān)Elasticsearch向量數(shù)據(jù)存儲(chǔ)與搜索內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java單鏈表的實(shí)現(xiàn)代碼

    Java單鏈表的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java單鏈表的實(shí)現(xiàn)代碼的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • Java Comparable和Comparator對(duì)比詳解

    Java Comparable和Comparator對(duì)比詳解

    這篇文章主要介紹了Java Comparable和Comparator對(duì)比詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Mockito mock Kotlin Object類方法報(bào)錯(cuò)解決方法

    Mockito mock Kotlin Object類方法報(bào)錯(cuò)解決方法

    這篇文章主要介紹了Mockito mock Kotlin Object類方法報(bào)錯(cuò)解決方法,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 詳解SpringBoot時(shí)間參數(shù)處理完整解決方案

    詳解SpringBoot時(shí)間參數(shù)處理完整解決方案

    這篇文章主要介紹了詳解SpringBoot時(shí)間參數(shù)處理完整解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 通過jenkins發(fā)布java項(xiàng)目到目標(biāo)主機(jī)上的詳細(xì)步驟

    通過jenkins發(fā)布java項(xiàng)目到目標(biāo)主機(jī)上的詳細(xì)步驟

    這篇文章主要介紹了通過jenkins發(fā)布java項(xiàng)目到目標(biāo)主機(jī)上的詳細(xì)步驟,發(fā)布java項(xiàng)目的步驟很簡單,通過拉取代碼并打包,備份目標(biāo)服務(wù)器上已有的要發(fā)布項(xiàng)目,具體內(nèi)容詳情跟隨小編一起看看吧
    2021-10-10
  • Java-Redis-Redisson分布式鎖的功能使用及實(shí)現(xiàn)

    Java-Redis-Redisson分布式鎖的功能使用及實(shí)現(xiàn)

    這篇文章主要介紹了Java-Redis-Redisson-分布式鎖的功能使用及實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • 基于SpringBoot實(shí)現(xiàn)自定義插件的流程詳解

    基于SpringBoot實(shí)現(xiàn)自定義插件的流程詳解

    在SpringBoot中,插件是一種擴(kuò)展機(jī)制,它可以幫助我們?cè)趹?yīng)用程序中快速地添加一些額外的功能,在本文中,我們將介紹如何使用 SpringBoot實(shí)現(xiàn)自定義插件,需要的朋友可以參考下
    2023-06-06
  • Java四種訪問控制修飾符知識(shí)點(diǎn)總結(jié)

    Java四種訪問控制修飾符知識(shí)點(diǎn)總結(jié)

    本篇文章給大家詳細(xì)分析了Java四種訪問控制修飾符的相關(guān)知識(shí)點(diǎn),有興趣的朋友可以參考學(xué)習(xí)下。
    2018-03-03
  • Spring?Boot項(xiàng)目獲取resources目錄下文件并返回給前端的方案

    Spring?Boot項(xiàng)目獲取resources目錄下文件并返回給前端的方案

    我們?cè)陧?xiàng)目中經(jīng)常碰到需要讀取固定文件的場(chǎng)景,如模板文件,一般做法是將文件放在resources目錄下,程序通過多種方式可以順利讀取文件,這篇文章主要給大家介紹了關(guān)于Spring?Boot項(xiàng)目獲取resources目錄下文件并返回給前端的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • Java開發(fā)常見異常及解決辦法詳解

    Java開發(fā)常見異常及解決辦法詳解

    這篇文章主要介紹了java程序常見異常及處理匯總,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09

最新評(píng)論