最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

Here’s the table of contents:

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

一、簡介

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

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

二、實驗前準備

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

  創(chuàng)建一個支持向量檢索的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]
}

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

3.1 余弦相似度:cosineSimilarity

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

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計算的文檔數(shù)量,需要提供一個過濾器 (query)。
  • script腳本在cosineSimilarity上增加了1.0,以防止得分為負。
  • 為了更好的利用DSL優(yōu)化器,可以使用參數(shù)的方式提供一個查詢向量。
  • 檢查缺失值:如果文檔中沒有用于執(zhí)行向量函數(shù)的向量字段的值,會拋出錯誤。
  • 可以使用doc['my_vector'].size() == 0來檢查文檔是否有my_vector字段的值。

腳本樣例:

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

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

3.2 計算點積:dotProduct

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

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
          ]
        }
      }
    }
  }
}

使用標準的sigmoid函數(shù)可以防止分數(shù)為負。

3.3 曼哈頓距離:l1norm

  l1norm函數(shù)計算給定查詢向量和文檔向量之間的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)生的分數(shù)就越低。因此,當我們需要相似的向量來獲得更高的分數(shù)時,我們將1norml2norm的輸出反過來。另外,為了避免在文檔向量與查詢完全匹配時被除0,在分母中加了1。

3.4 歐幾里得距離:l2norm

  l2norm函數(shù)計算給定查詢向量和文檔向量之間的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 自定義計算函數(shù)

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

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

  • doc[<field>].vectorValue – 以浮點數(shù)數(shù)組的形式返回向量的值。
  • doc[<field>].magnitude – 將向量的大小作為浮點數(shù)返回(對于7.5版本之前創(chuàng)建的向量,其向量的大小不會被存儲)。所以這個函數(shù)每次被調(diào)用時都會進行重新計算。
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
        }
      }
    }
  }
}

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

相關文章

  • Java線程生命周期及轉(zhuǎn)換過程

    Java線程生命周期及轉(zhuǎn)換過程

    這篇文章主要介紹了Java線程生命周期及轉(zhuǎn)換過程,線程的生命周期指的是線程從創(chuàng)建到銷毀的整個過程初始狀態(tài)、可運行狀態(tài)、運行狀態(tài)、休眠狀態(tài)、終止狀態(tài),更多詳細介紹,需要的小伙伴可以參考下面文章內(nèi)容
    2022-05-05
  • Java中的Semaphore信號量深入解析

    Java中的Semaphore信號量深入解析

    這篇文章主要介紹了Java中的Semaphore信號量深入解析,Semaphore是Java里面另外一個基本的并發(fā)工具包類,主要的的作用是用來保護共享資源的訪問的,也就是僅僅允許一定數(shù)量的線程訪問共享資源,需要的朋友可以參考下
    2023-11-11
  • MybatisPlus IService接口功能介紹

    MybatisPlus IService接口功能介紹

    MybatisPlus中的IService接口為開發(fā)者提供了一系列基礎數(shù)據(jù)庫操作方法,如增刪改查等,通過泛型支持不同類型的實體和主鍵,IService的默認實現(xiàn)類為ServiceImpl,它實現(xiàn)了接口中的基本方法,用戶可通過繼承ServiceImpl來擴展自定義的業(yè)務邏輯
    2024-09-09
  • Java redis存Map對象類型數(shù)據(jù)的實現(xiàn)

    Java redis存Map對象類型數(shù)據(jù)的實現(xiàn)

    本文主要介紹了Java redis存Map<String,RedisCustom>對象類型數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • 詳解Spring AOP 實現(xiàn)主從讀寫分離

    詳解Spring AOP 實現(xiàn)主從讀寫分離

    本篇文章主要介紹了Spring AOP 實現(xiàn)主從讀寫分離,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • java基于ConcurrentHashMap設計細粒度實現(xiàn)代碼

    java基于ConcurrentHashMap設計細粒度實現(xiàn)代碼

    這篇文章主要介紹了java基于ConcurrentHashMap設計細粒度實現(xiàn)代碼,通過ConcurrentHashMap實現(xiàn)細粒度,具有一定參考價值,需要的朋友可以了解。
    2017-10-10
  • Java?八種基本數(shù)據(jù)類型最新整理

    Java?八種基本數(shù)據(jù)類型最新整理

    這篇文章給大家分享Java八種基本數(shù)據(jù)類型,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-06-06
  • JavaWeb 入門篇:創(chuàng)建Web項目,Idea配置tomcat

    JavaWeb 入門篇:創(chuàng)建Web項目,Idea配置tomcat

    這篇文章主要介紹了IDEA創(chuàng)建web項目配置Tomcat的詳細教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • Java基礎之TreeMap詳解

    Java基礎之TreeMap詳解

    這篇文章主要介紹了Java基礎之TreeMap詳解,文中有非常詳細的代碼示例,對正在學習java基礎的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java實現(xiàn)List分組的常見方法詳解

    Java實現(xiàn)List分組的常見方法詳解

    這篇文章主要為大家詳細介紹了使用Java實現(xiàn)List分組的幾個常見方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-12-12

最新評論

井冈山市| 城固县| 吉林省| 唐海县| 仙桃市| 安吉县| 独山县| 奉化市| 丹凤县| 南乐县| 德庆县| 高清| 邓州市| 四川省| 桃园市| 武安市| 北安市| 绥化市| 文水县| 抚顺县| 肃北| 礼泉县| 博野县| 大连市| 巴马| 会泽县| 九江县| 普陀区| 印江| 肃北| 岢岚县| 宣汉县| 贵溪市| 务川| 新田县| 平度市| 岳普湖县| 五河县| 赤城县| 洛隆县| 成安县|