/images/avatar.png

Elasticsearch 向量搜索

Elasticsearch 向量搜索

本文将会介绍 Elasticsearch 向量搜索的两种方式。

向量搜索

提到向量搜索,我想你一定想知道:

  1. 向量搜索是什么?
  2. 向量搜索的应用场景有哪些?
  3. 向量搜索与全文搜索有何不同?

ES 的全文搜索简而言之就是将文本进行分词,然后基于词通过 BM25 算法计算相关性得分,从而找到与搜索语句相似的文本,其本质上是一种 term-based(基于词)的搜索。

Terraform: 基础设施即代码

Terraform: 基础设施即代码

问题

现如今有很多 IT 系统的基础设施直接使用了云厂商提供的服务,假设我们需要构建以下基础设施:

  • VPC 网络
  • 虚拟主机
  • 负载均衡器
  • 数据库
  • 文件存储

那么在公有云的环境中,我们一般怎么做?

加速 Kubernetes 镜像拉取

加速 Kubernetes 镜像拉取

Kubernetes pod 启动时会拉取用户指定的镜像,一旦这个过程耗时太久就会导致 pod 长时间处于 pending 的状态,从而无法快速提供服务。

镜像拉取的过程参考下图所示:

web 安全系列文章【译文】

解读 MySQL Client/Server Protocol: Connection & Replication

解读 MySQL Client/Server Protocol: Connection & Replication

MySQL 客户端与服务器之间的通信基于特定的 TCP 协议,本文将会详解其中的 Connection 和 Replication 部分,这两个部分分别对应的是客户端与服务器建立连接、完成认证鉴权,以及客户端注册成为一个 slave 并获取 master 的 binlog 日志。

Elasticsearch 分布式搜索的运行机制

Elasticsearch 分布式搜索的运行机制

ES 有两种 search_type 即搜索类型:

  • query_then_fetch (默认)
  • dfs_query_then_fetch

query_then_fetch

https://raw.githubusercontent.com/RifeWang/images/master/es-query-then-fetch.png

  1. 用户发起搜索,请求到集群中的某个节点。
  2. query 会被发送到所有相关的 shard 分片上。
  3. 每个 shard 分片独立执行 query 搜索文档并进行排序分页等,打分时使用的是分片本身的 Local Term/Document 频率。
  4. 分片的 query 结果(只有元数据,例如 _id_score)返回给请求节点。
  5. 请求节点对所有分片的 query 结果进行汇总,然后根据打分排序和分页,最后选择出搜索结果文档(也只有元数据)。
  6. 根据元数据去对应的 shard 分片拉取存储在磁盘上的文档的详细数据。
  7. 得到详细的文档数据,组成搜索结果,将结果返回给用户。

缺点:由于每个分片独立使用自身的而不是全局的 Term/Document 频率进行相关度打分,当数据分布不均匀时可能会造成打分偏差,从而影响最终搜索结果的相关性。

Elasticsearch Search Template

Elasticsearch Search Template

所谓 search template 搜索模板其实就是:

  1. 预先定义好查询语句 DSL 的结构并预留参数
  2. 搜索的时再传入参数值
  3. 渲染出完整的 DSL ,最后进行搜索

使用搜索模板可以将 DSL 从应用程序中解耦出来,并且可以更加灵活的更改查询语句。

构造请求日志分析系统

构造请求日志分析系统

请求日志记录哪些数据

  • time_local : 请求的时间
  • remote_addr : 客户端的 IP 地址
  • request_method : 请求方法
  • request_schema : 请求协议,常见的 http 和 https
  • request_host : 请求的域名
  • request_path : 请求的 path 路径
  • request_query : 请求的 query 参数
  • request_size : 请求的大小
  • referer : 请求来源地址,假设你在 a.com 网站下贴了 b.com 的链接,那么当用户从 a.com 点击访问 b.com 的时候,referer 记录的就是 a.com ,这个是浏览器的行为
  • user_agent : 客户端浏览器相关信息
  • status : 请求的响应状态
  • request_time : 请求的耗时
  • bytes_sent : 响应的大小

很多时候我们会使用负载网关去代理转发请求给实际的后端服务,这时候请求日志还会包括以下数据:

Elasticsearch 自定义打分 Function score query

Elasticsearch 自定义打分 Function score query

Elasticsearch 会为 query 的每个文档计算一个相关度得分 score ,并默认按照 score 从高到低的顺序返回搜索结果。 在很多场景下,我们不仅需要搜索到匹配的结果,还需要能够按照某种方式对搜索结果重新打分排序。例如: