前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Elasticsearch使用:Vector API

Elasticsearch使用:Vector API

原创
作者头像
HLee
修改于 2021-01-18 02:23:33
修改于 2021-01-18 02:23:33
1.8K00
代码可运行
举报
文章被收录于专栏:房东的猫房东的猫
运行总次数:0
代码可运行

简介

官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-script-score-query.html#vector-functions

目前这个功能还是处于试验阶段。在未来的版本中可能会出现变化。基于 Vector(向量)的打分目前分为一下两种:

它们都是基于功能进行评分的。在实际的使用中,我们必须注意的是:向量函数的计算过程中,所有匹配的文档均被线性扫描。 因此,期望查询时间随匹配文档的数量线性增长。 因此,我们建议使用查询参数限制匹配文档的数量。

Vector

我们首先创建一个叫做 books 的索引,并定义它的 mapping 如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PUT books
{
  "mappings": {
    "properties": {
      "author": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "category": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "format": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "isbn13": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "pages": {
        "type": "long"
      },
      "price": {
        "type": "float"
      },
      "publisher": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "rating": {
        "type": "float"
      },
      "release_year": {
        "type": "date",
        "format": "strict_year"
      },
      "title": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "vector_recommendation": {
        "type": "dense_vector",
        "dims": 3
      }
    }
  }
}

然后,我们使用 bulk API 接口来导入数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PUT books/_bulk
{ "index" : { "_id" : "database-internals" } }
{"isbn13":"978-1492040347","author":"Alexander Petrov", "title":"Database Internals: A deep-dive into how distributed data systems work","publisher":"O'Reilly","category":["databases","information systems"],"pages":350,"price":47.28,"format":"paperback","rating":4.5, "release_year" : "2019", "vector_recommendation" : [3.5, 4.5, 5.2]}
{ "index" : { "_id" : "designing-data-intensive-applications" } }
{"isbn13":"978-1449373320", "author":"Martin Kleppmann", "title":"Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems","publisher":"O'Reilly","category":["databases" ],"pages":590,"price":31.06,"format":"paperback","rating":4.4, "release_year" : "2017", "vector_recommendation" : [5.9, 4.4, 6.8]}
{ "index" : { "_id" : "kafka-the-definitive-guide" } }
{"isbn13":"978-1491936160","author":[ "Neha Narkhede", "Gwen Shapira", "Todd Palino"], "title":"Kafka: The Definitive Guide: Real-time data and stream processing at scale", "publisher":"O'Reilly","category":["databases" ],"pages":297,"price":37.31,"format":"paperback","rating":3.9, "release_year" : "2017", "vector_recommendation" : [2.97, 3.9, 6.2]}
{ "index" : { "_id" : "effective-java" } }
{"isbn13":"978-1491936160","author": "Joshua Block", "title":"Effective Java", "publisher":"Addison-Wesley", "category":["programming languages", "java" ],"pages":412,"price":27.91,"format":"paperback","rating":4.2, "release_year" : "2017", "vector_recommendation" : [4.12, 4.2, 7.2]}
{ "index" : { "_id" : "daemon" } }
{"isbn13":"978-1847249616","author":"Daniel Suarez", "title":"Daemon","publisher":"Quercus","category":["dystopia","novel"],"pages":448,"price":12.03,"format":"paperback","rating":4.0, "release_year" : "2011", "vector_recommendation" : [4.48, 4.0, 8.7]}
{ "index" : { "_id" : "cryptonomicon" } }
{"isbn13":"978-1847249616","author":"Neal Stephenson", "title":"Cryptonomicon","publisher":"Avon","category":["thriller", "novel" ],"pages":1152,"price":6.99,"format":"paperback","rating":4.0, "release_year" : "2002", "vector_recommendation" : [10.0, 4.0, 9.3]}
{ "index" : { "_id" : "garbage-collection-handbook" } }
{"isbn13":"978-1420082791","author": [ "Richard Jones", "Antony Hosking", "Eliot Moss" ], "title":"The Garbage Collection Handbook: The Art of Automatic Memory Management","publisher":"Taylor & Francis","category":["programming algorithms" ],"pages":511,"price":87.85,"format":"paperback","rating":5.0, "release_year" : "2011", "vector_recommendation" : [5.1, 5.0, 1.3] }
{ "index" : { "_id" : "radical-candor" } }
{"isbn13":"978-1250258403","author": "Kim Scott", "title":"Radical Candor: Be a Kick-Ass Boss Without Losing Your Humanity","publisher":"Macmillan","category":["human resources","management", "new work"],"pages":404,"price":7.29,"format":"paperback","rating":4.0, "release_year" : "2018", "vector_recommendation" : [4.0, 4.0, 9.2] }

这样我们的索引 books 中有8个文档。我们仔细地查看一下我们输入的数据,它里面含有一个叫做 vecto_recommendation 的字段

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"vector_recommendation" : [3.5, 4.5, 5.2]
  • 向量里的第一个数据3.5,实际上是我们的在这个文档里的 pages 除以100而得到的。如果这本书的页数越多,则表示这个数值越大。它的范围在0-10之间
  • 向量里的第二个数据是这本书的 rating,也即评价。这个值在这个文档里的 rating 项可以查到。范围在0-5之间
  • 向量里的第三个数据是书的价钱,这个值越低表明,价钱越贵,因为我们都喜欢便宜一点的书籍。0代表100元以上,10则表示10元以下的书

在上面的 mapping 中,我们是这样定义的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"vector_recommendation": { "type": "dense_vector", "dims": 3 }

它定义了这个 vector_recommendation 的类型是 dense_vector,它是一个3维的向量。

现在我们的数据都已经准备好了。我们接下来做一些我们喜欢的搜索。

vector搜索

在上面我们已经建立了我们的向量模型。那么我们怎么能够找到那些书的页数比较少,便宜的而且评价非常高的书呢?我们可以采用如下的搜索方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET books/_search
{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": "cosineSimilarity(params.query_vector, doc['vector_recommendation']) + 1.0",
        "params": {
          "query_vector": [
            1,
            5,
            10
          ]
        }
      }
    }
  }
}

在上面的搜索中,我们通过脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cosineSimilarity(params.query_vector, doc['vector_recommendation']) + 1.0

来计算我们的搜索的分数。这里加上1的作用是为了避免我们最后的分数是负数。

在上面的表达式中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"params": {"query_vector": [ 1, 5, 10 ] }

我们想寻找的书是最好是100页的书,因为第一项是1;我们也同时想找一个评价好的书,因为第二项是5;同时我们想找最便宜的书,因为第三项是10。按照上面的要求,我们可以得到如下的搜索结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 8,
      "relation" : "eq"
    },
    "max_score" : 1.9568613,
    "hits" : [
      {
        "_index" : "books",
        "_type" : "_doc",
        "_id" : "radical-candor",
        "_score" : 1.9568613,
        "_source" : {
          "isbn13" : "978-1250258403",
          "author" : "Kim Scott",
          "title" : "Radical Candor: Be a Kick-Ass Boss Without Losing Your Humanity",
          "publisher" : "Macmillan",
          "category" : [
            "human resources",
            "management",
            "new work"
          ],
          "pages" : 404,
          "price" : 7.29,
          "format" : "paperback",
          "rating" : 4.0,
          "release_year" : "2018",
          "vector_recommendation" : [
            4.0,
            4.0,
            9.2
          ]
        }
      },
      {
        "_index" : "books",
        "_type" : "_doc",
        "_id" : "kafka-the-definitive-guide",
        "_score" : 1.9520907,
        "_source" : {
          "isbn13" : "978-1491936160",
          "author" : [
            "Neha Narkhede",
            "Gwen Shapira",
            "Todd Palino"
          ],
          "title" : "Kafka: The Definitive Guide: Real-time data and stream processing at scale",
          "publisher" : "O'Reilly",
          "category" : [
            "databases"
          ],
          "pages" : 297,
          "price" : 37.31,
          "format" : "paperback",
          "rating" : 3.9,
          "release_year" : "2017",
          "vector_recommendation" : [
            2.97,
            3.9,
            6.2
          ]
        }
      },
      {
        "_index" : "books",
        "_type" : "_doc",
        "_id" : "daemon",
        "_score" : 1.9394372,
        "_source" : {
          "isbn13" : "978-1847249616",
          "author" : "Daniel Suarez",
          "title" : "Daemon",
          "publisher" : "Quercus",
          "category" : [
            "dystopia",
            "novel"
          ],
          "pages" : 448,
          "price" : 12.03,
          "format" : "paperback",
          "rating" : 4.0,
          "release_year" : "2011",
          "vector_recommendation" : [
            4.48,
            4.0,
            8.7
          ]
        }
      },
      {
        "_index" : "books",
        "_type" : "_doc",
        "_id" : "effective-java",
        "_score" : 1.9305289,
        "_source" : {
          "isbn13" : "978-1491936160",
          "author" : "Joshua Block",
          "title" : "Effective Java",
          "publisher" : "Addison-Wesley",
          "category" : [
            "programming languages",
            "java"
          ],
          "pages" : 412,
          "price" : 27.91,
          "format" : "paperback",
          "rating" : 4.2,
          "release_year" : "2017",
          "vector_recommendation" : [
            4.12,
            4.2,
            7.2
          ]
        }
      },
      {
        "_index" : "books",
        "_type" : "_doc",
        "_id" : "database-internals",
        "_score" : 1.9005439,
        "_source" : {
          "isbn13" : "978-1492040347",
          "author" : "Alexander Petrov",
          "title" : "Database Internals: A deep-dive into how distributed data systems work",
          "publisher" : "O'Reilly",
          "category" : [
            "databases",
            "information systems"
          ],
          "pages" : 350,
          "price" : 47.28,
          "format" : "paperback",
          "rating" : 4.5,
          "release_year" : "2019",
          "vector_recommendation" : [
            3.5,
            4.5,
            5.2
          ]
        }
      },
      {
        "_index" : "books",
        "_type" : "_doc",
        "_id" : "designing-data-intensive-applications",
        "_score" : 1.8525991,
        "_source" : {
          "isbn13" : "978-1449373320",
          "author" : "Martin Kleppmann",
          "title" : "Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems",
          "publisher" : "O'Reilly",
          "category" : [
            "databases"
          ],
          "pages" : 590,
          "price" : 31.06,
          "format" : "paperback",
          "rating" : 4.4,
          "release_year" : "2017",
          "vector_recommendation" : [
            5.9,
            4.4,
            6.8
          ]
        }
      },
      {
        "_index" : "books",
        "_type" : "_doc",
        "_id" : "cryptonomicon",
        "_score" : 1.7700485,
        "_source" : {
          "isbn13" : "978-1847249616",
          "author" : "Neal Stephenson",
          "title" : "Cryptonomicon",
          "publisher" : "Avon",
          "category" : [
            "thriller",
            "novel"
          ],
          "pages" : 1152,
          "price" : 6.99,
          "format" : "paperback",
          "rating" : 4.0,
          "release_year" : "2002",
          "vector_recommendation" : [
            10.0,
            4.0,
            9.3
          ]
        }
      },
      {
        "_index" : "books",
        "_type" : "_doc",
        "_id" : "garbage-collection-handbook",
        "_score" : 1.528916,
        "_source" : {
          "isbn13" : "978-1420082791",
          "author" : [
            "Richard Jones",
            "Antony Hosking",
            "Eliot Moss"
          ],
          "title" : "The Garbage Collection Handbook: The Art of Automatic Memory Management",
          "publisher" : "Taylor & Francis",
          "category" : [
            "programming algorithms"
          ],
          "pages" : 511,
          "price" : 87.85,
          "format" : "paperback",
          "rating" : 5.0,
          "release_year" : "2011",
          "vector_recommendation" : [
            5.1,
            5.0,
            1.3
          ]
        }
      }
    ]
  }
}

我们可以看出来 “Radical Candor: Be a Kick-Ass Boss Without Losing Your Humanity” 是最贴近的书。我们可以看一下它的recommendation_vector:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"vector_recommendation" : [ 4.0, 4.0, 9.2 ]

这是所有的书里最贴近我们搜索要求的书了。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
PHP使用swoole实现多线程爬虫[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/111933.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/11
6420
PHP使用swoole实现多线程爬虫[通俗易懂]
2018年swoole实战7-进程详解创建子进程调用外部程序查看进程树多进程的实战案例
如果用php去抓取网页内容,传统的方式是用一个for循环,将url逐个遍历,假设每个url耗时1秒,6个url就需要耗时6s,这种方式效率太低了。通过swoole的进程管理模块,我们可以实现多进程抓取内容,每个进程对应负责一个url,从而实现1秒完成抓取任务
章鱼喵
2018/08/02
6230
Swoole入门到实战(二):进程,内存和协程、Swoole完美支持ThinkPHP5
以树状图显示进程间的关系:pstree -p 进程id 启动成功后会创建worker_num+2个进程。Master进程+Manager进程+serv->worker_num个Worker进程
唐成勇
2019/05/26
1.4K0
《六》Swoole 整合成一个小框架
写了关于 Swoole 入门的 5 篇文章后,增加了不少的关注者,也得到了一些大佬的鼓励和建议,也有很多关注者都加了微信好友,交流之后发现一些朋友比我优秀还比我努力。
新亮
2019/05/28
6340
《六》Swoole 整合成一个小框架
swoole_proces实现多进程
简介 swoole_process 是swoole提供的进程管理模块,用来替代PHP的pcntl扩展。
猿哥
2019/07/25
7530
【Swoole系列4.5】协程并发调度
在学习了协程的通信功能 Channel 之后,我们紧接着就讲了一个 WaitGroup 功能。其实,它本身就是一个协程调度工具。关于它的作用我们不再赘述了,毕竟上一篇文章已经讲得很清楚明白了。今天我们再接着 WaitGroup 的话题,继续讲讲协程并发调度相关的内容。
硬核项目经理
2023/03/03
5080
【Swoole系列4.5】协程并发调度
PHP Swoole学习笔记,持续记录
匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数 callable参数的值。
房东的狗丶
2023/02/17
2.5K0
【Swoole系列3.3】单进程管理Process
既然我们的服务应用已经提供了多进程的运行模式,那么我们可以直接自己来操作进程吗?答案当然是没问题的。今天我们来看到的就是在 Swoole 中如何操作单个进程,其实也就是学习一个 Process 对象的使用。
硬核项目经理
2023/03/03
7880
【Swoole系列3.3】单进程管理Process
详解PHP swoole process的使用方法
引入背景:假如我们每天有10000个订单生成,需要同步到仓储系统中去,以前做法是开启一个crontab去跑这些任务,但是发现总有感觉同步效率低,间隔时间都是分钟级别的。 解决方案测试:我们将同步订单的任务表添加一个hash作为key,作为分发条件,因为mysql中select如果做mod函数是用不到索引的,所以我们自己做随机hash,但是务必不需要范围太大,以免服务器资源不够,方法是根据hashkey投放到不同的进程中进行同步,测试代码如下
用户2323866
2021/07/02
4580
《二》Swoole Task 的应用
Swoole 的实现方式是 worker 进程处理数据请求,分配给 task 进程执行。
新亮
2019/05/28
7040
《二》Swoole Task 的应用
Swoole 启动一个服务,开启了哪些进程和线程?
上面的代码简单说下,创建了一个 TCP 服务器,启动了 3 个 worker 进程, 3 个 task 进程,因为启用了 task 功能,所以必须注册 onTask、onFinish 2 个事件的回调函数。
新亮
2019/06/19
1K0
Swoole 启动一个服务,开启了哪些进程和线程?
Swoole的多进程模块
Swoole是有自己的一个进程管理模块,用来替代PHP的pcntl扩展,需要注意Process进程在系统是非常昂贵的资源,创建进程消耗很大,另外创建的进程过多会导致进程切换开销大幅上升。
码农编程进阶笔记
2021/07/20
8100
Swoole 协程学习
第一次接触协程这个概念,是在学习Swoole时,那时看官方文档并不能完全理解协程到底是个什么东西以及该如何正确的使用它。
用户8094775
2020/12/15
5920
【Swoole系列3.6】进程同步与共享内存
通过前面几篇的学习,相信你已经对 Swoole 的进程有了一定的了解。不管是单进程还是进程池,我们都着重讲了进程间的通讯问题。毕竟对于进程来说,它们是内存隔离的,通讯相对来说就是一个很大的问题。而我们之前讲的内容其实都是不使用第三方工具来进行通信的,但其实更方便的方式是直接使用一些第三方工具做为中间的存储媒介,让不同的进程直接去读取这里的内容就可以实现通信的能力了。比如说我们最常见的就是使用 Redis ,不过即使是 Redis ,甚至是使用了连接池,也会有连接建立的过程,所以也并不是最高效的。今天,我们要学习的一个共享内存表格,是 Swoole 提供的一种更高效的数据同步方式。除此之外,我们还要学习另外两个非常常用的进程间同步功能,一个是无锁计数器,另一个就是进程锁。
硬核项目经理
2023/03/03
6810
【Swoole系列3.6】进程同步与共享内存
《五》Swoole 多协议 多端口 的应用
Swoole 支持了2种类型的自定义网络通信协议 :EOF结束符协议、固定包头+包体协议。
新亮
2019/05/28
9270
《五》Swoole 多协议 多端口 的应用
Swoole入门到实战(一):PHP7&Swoole源码安装、玩转网络通信引擎、异步非堵塞IO场景
source FileName 作用:在当前bash环境下读取并执行FileName中的命令。 用于重新执行刚修改的初始化文档,如 .bash_profile 和 .profile 等等 注:该命令通常用命令“.”来替代 如:source /etc/profile 与 . /etc/profile是等效的
唐成勇
2019/05/26
1.7K0
swoole 学习第二章 Event Io 与 process
刚刚才说了,子进程当复制一个父进程的时候会复制它的内存以及它的上下文环境,除了这些之外,子进程会复制父进程的io句柄(fd描述符)
Marco爱吃红烧肉
2021/07/23
4870
swoole学习笔记
swoole是面向生产环境的 PHP 异步网络通信引擎,本笔记是本人在学习完慕课网的课程《Swoole入门到实战打造高性能赛事直播平台》后的笔记,是对学习的代码整理的补充,学习过程中整理的github代码地址:
CS逍遥剑仙
2019/03/03
1.1K0
【Swoole系列2.2】Http、TCP、UDP服务
其实在上篇文章中,我们就已经运行起来了一个 Http 服务,也简单地说明了一下使用 Swoole 运行起来的服务与普通的 PHP 开发有什么区别。想必你现在会说这没什么大不了的呀,这些我们的传统开发又不是做不到,而且还更方便一些。在基础篇章中,我们还不会看到 Swoole 在性能上的优势,毕竟最基础的一些服务搭建还是要先了解清楚的。因此,今天我们将继续再深入的讲一下 Http 相关的内容以及了解一下 TCP、UDP 服务在 Swoole 中如何运行。
硬核项目经理
2023/03/03
5360
【Swoole系列2.2】Http、TCP、UDP服务
workerman5.0篇〡Fiber、Swoole、Swow三协程并行运行
Fiber协程,在webman框架安装后,直接启动webman,事件驱动默认会切换到revolt/event-loop事件驱动。
Tinywan
2025/01/07
3030
workerman5.0篇〡Fiber、Swoole、Swow三协程并行运行
相关推荐
PHP使用swoole实现多线程爬虫[通俗易懂]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档