在 Elasticsearch 中连接两个索引

news2025/5/13 8:59:57

作者:来自 Elastic Kofi Bartlett

解释如何使用 terms queryenrich processor 来连接 Elasticsearch 中的两个索引。

更多有关连接两个索引的查询,请参阅文章 “Elastic:开发者上手指南” 中的 “丰富数据及 lookup” 章节。

Elasticsearch 拥有丰富的新功能,帮助你为自己的使用场景构建最佳搜索解决方案。深入阅读我们的示例笔记本,了解更多信息,开始免费云端试用,或立即在本地机器上尝试 Elastic。


在 Elasticsearch 中,连接两个索引不像传统 SQL 数据库那样直接。然而,可以通过 Elasticsearch 提供的一些技术和功能实现类似的效果。本文将深入介绍在 Elasticsearch 中连接两个索引的过程,重点讲解如何使用 terms queryenrich processor

 使用 terms query 连接两个索引

terms query 是在 Elasticsearch 中连接两个索引最有效的方法之一。这个查询用于检索某个字段中包含一个或多个精确值的文档。以下是使用它来连接两个索引的方法: 

  1. 首先,需要从第一个索引中获取所需的数据。这可以通过一个简单的 GET 请求完成。
  2. 获取到第一个索引中的数据后,可以使用这些数据去查询第二个索引。这通过 terms query 实现,你需要指定要匹配的字段和对应的值。

下面是一个示例:

  • # 第一步:查 index A,得到 id:
GET index_a/_search
{
  "query": {
    "match": {
      "user": "alice"
    }
  }
}
  • 第二步:根据 index A 的结果查询 index B
GET index_b/_search
{
  "query": {
    "terms": {
      "user_id": [ "123", "456" ]  # 从 index_a 拿到的 id
    }
  }
}

terms 查询还支持使用一种称为 terms lookup 的技术,在一次请求中执行上述两个步骤。Elasticsearch 会自动从另一个索引中检索匹配值。例如,你有一个名为 teams 的索引,里面包含球员列表:

PUT teams/_doc/team1
{
  "players":   ["john", "bill", "michael"]
}

PUT teams/_doc/team2
{
  "players":   ["aaron", "joe", "donald"]
}

现在,可以查询 people 索引,获取所有在 team1 打球的人,如下所示:

GET people/_search?pretty
{
  "query": {
    "terms": {
        "name" : {
            "index" : "teams",
            "id" : "team1",
            "path" : "players"
        }
    }
  }
}

在上面的例子中,Elasticsearch 会透明地从 teams 索引中的 team1 文档中检索球员名字(即“john”,“bill”,“michael”),并找到所有在 people 文档中 name 字段包含这些值的文档。等效的 SQL 查询如下:

SELECT p.* FROM people p
INNER JOIN teams t ON p.name = t.players

更多阅读,请参阅 “Elasticsearch:Terms lookup query - 关联两个不同索引的搜索”。

使用 enrich 处理器连接两个索引

enrich 处理器是另一个强大的工具,可以用于在 Elasticsearch 中连接两个索引。此处理器通过从预定义的 enrich 索引中添加数据来丰富传入文档的数据。

以下是如何使用 enrich 处理器连接两个索引的步骤:

  1. 首先,你需要创建一个 enrich 策略。该策略定义了要用于丰富的索引以及要匹配的字段。下面是一个示例:

    PUT /_enrich/policy/my_enrich_policy
    {
      "match": {
        "indices": "first_index",
        "match_field": "field_in_first_index",
        "enrich_fields": ["field_to_enrich"]
      }
    }
  2.  一旦创建了策略,你需要执行它:  

    POST /_enrich/policy/my_enrich_policy/_execute
  3. 执行策略后,你可以在摄取管道中使用 enrich 处理器来丰富传入文档的数据:

PUT /_ingest/pipeline/my_pipeline
{
  "processors": [
    {
      "enrich": {
        "policy_name": "my_enrich_policy",
        "field": "field_in_second_index",
        "target_field": "enriched_field"
      }
    }
  ]
}

在这个例子中,field_in_second_index 是第二个索引中你想要用第一个索引的数据来丰富的字段,enriched_field 是将包含丰富数据的新字段。

这种方法的一个缺点是,如果第一个索引中的数据发生变化,丰富策略需要重新执行,因为丰富索引不会自动从源索引同步或更新。然而,如果第一个索引相对稳定,那么这种方法效果很好。

更多阅读,请参阅文章 “Elasticsearch:如何使用 Elasticsearch ingest 节点来丰富日志和指标” 及 “Elasticsearch:使用 Elasticsearch ingest pipeline 丰富数据”。

结论

总之,虽然 Elasticsearch 不支持传统的连接操作,但它提供了像 terms 查询和 enrich 处理器这样的功能,可以用来实现类似的结果。需要注意的是,这些方法有其局限性,应该根据具体的需求和数据的性质谨慎使用。

原文:Joining two indexes in Elasticsearch - Elasticsearch Labs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2374537.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 Watt toolkit 加速 git clone

一、前言 Watt toolkit 工具是我经常用于加速 GitHub 网页和 Steam 游戏商店访问的工具,最近想加速 git clone,发现可以使用 Watt toolkit 工具的代理实现。 二、查看端口 我这里以 Ubuntu 为例,首先是需要将加速模式设置为 System&#xff1…

应急响应靶机——WhereIS?

用户名及密码:zgsf/zgsf 下载资源还有个解题.exe: 1、攻击者的两个ip地址 2、flag1和flag2 3、后门程序进程名称 4、攻击者的提权方式(输入程序名称即可) 之前的命令: 1、攻击者的两个ip地址 先获得root权限,查看一下历史命令记录&#x…

Docke容器下JAVA系统时间与Linux服务器时间不一致问题解决办法

本篇文章主要讲解,通过docker部署jar包运行环境后出现java系统内时间与服务器、个人电脑真实时间不一致的问题原因及解决办法。 作者:任聪聪 日期:2025年5月12日 问题现象: 说明:与实际时间不符,同时与服务…

【MCP】其他MCP服务((GitHub)

【MCP】其他MCP服务((GitHub) 1、其他MCP服务(GitHub) MCP广场:https://www.modelscope.cn/mcp 1、其他MCP服务(GitHub) 打开MCP广场 找到github服务 访问github生成令牌 先…

内存 -- Linux内核内存分配机制

内存可以怎么用? kmalloc:内核最常用,用于频繁使用的小内存申请 alloc_pages:以页框为单位申请,物理内存连续 vmalloc:虚拟地址连续的内存块,物理地址不连线 dma_alloc_coherent:常…

关于读写锁的一些理解

同一线程的两种情况: 读读: public static void main(String[] args) throws InterruptedException {ReentrantReadWriteLock lock new ReentrantReadWriteLock();Lock readLock lock.readLock();Lock writeLock lock.writeLock();readLock.lock();S…

C++修炼:模板进阶

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞&#xff0c;关注&am…

android-ndk开发(10): use of undeclared identifier ‘pthread_getname_np‘

1. 报错描述 使用 pthread 获取线程名字&#xff0c; 用到 pthread_getname_np 函数。 交叉编译到 Android NDK 时链接报错 test_pthread.cpp:19:5: error: use of undeclared identifier pthread_getname_np19 | pthread_getname_np(thread_id, thread_name, sizeof(thr…

UI自动化测试框架:PO 模式+数据驱动

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1. PO 设计模式简介 什么是 PO 模式&#xff1f; PO&#xff08;PageObject&#xff09;设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成…

Java笔记4

第一章 static关键字 2.1 概述 以前我们定义过如下类&#xff1a; public class Student {// 成员变量public String name;public char sex; // 男 女public int age;// 无参数构造方法public Student() {}// 有参数构造方法public Student(String a) {} }我们已经知道面向…

2025年渗透测试面试题总结-渗透测试红队面试八(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 渗透测试红队面试八 二百一十一、常见中间件解析漏洞利用方式 二百一十二、MySQL用户密码存储与加密 …

MiniMind:3块钱成本 + 2小时!训练自己的0.02B的大模型。minimind源码解读、MOE架构

大家好&#xff0c;我是此林。 目录 1. 前言 2. minimind模型源码解读 1. MiniMind Config部分 1.1. 基础参数 1.2. MOE配置 2. MiniMind Model 部分 2.1. MiniMindForCausalLM: 用于语言建模任务 2.2. 主干模型 MiniMindModel 2.3. MiniMindBlock: 模型的基本构建块…

如何进行前端性能测试?--性能标准

如何进行前端性能测试&#xff1f;–性能标准 前端性能测试指标&#xff1a; 首次加载阶段 场景&#xff1a;用户首次访问网页&#xff0c;在页面还未完全呈现各种内容和功能时的体验。重要指标及原因 首次内容绘制&#xff08;FCP - First Contentful Paint&#xff09;​…

通信网络编程——JAVA

1.计算机网络 IP 定义与作用 &#xff1a;IP 地址是在网络中用于标识设备的数字标签&#xff0c;它允许网络中的设备之间相互定位和通信。每一个设备在特定网络环境下都有一个唯一的 IP 地址&#xff0c;以此来确定其在网络中的位置。 分类 &#xff1a;常见的 IP 地址分为 I…

Off-Policy策略演员评论家算法SAC详解:python从零实现

引言 软演员评论家&#xff08;SAC&#xff09;是一种最先进的Off-Policy策略演员评论家算法&#xff0c;专为连续动作空间设计。它在 DDPG、TD3 的基础上进行了显著改进&#xff0c;并引入了最大熵强化学习的原则。其目标是学习一种策略&#xff0c;不仅最大化预期累积奖励&a…

热门CPS联盟小程序聚合平台与CPA推广系统开发搭建:助力流量变现与用户增长

一、行业趋势&#xff1a;CPS与CPA模式成流量变现核心 在移动互联网流量红利见顶的背景下&#xff0c;CPS&#xff08;按销售付费&#xff09;和CPA&#xff08;按行为付费&#xff09;模式因其精准的投放效果和可控的成本&#xff0c;成为企业拉新与用户增长的核心工具。 CPS…

Linux系统管理与编程15:vscode与Linux连接进行shell开发

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 【1】打开vscode 【2】点击左下角连接图标 【3】输入远程连接 选择合适的操作系统 输入密码&#xff0c;就进入Linux环境的shell编程了。 在vscode下面粘贴拷贝更方便。比如 然后在v…

RabbitMQ概念详解

什么是消息队列&#xff1f; 消息队列是一种在应用程序之间传递消息的技术。它提供了一种异步通信模式&#xff0c;允许应用程序在不同的时间处理消 息。消息队列通常用于解耦应用程序&#xff0c;以便它们可以独立地扩展和修改。在消息队列中&#xff0c;消息发送者将消息发送…

linux基础操作5------(shell)

一.前言 本文来介绍一下linux的shell&#xff0c;除了最后的那个快捷键&#xff0c;其他的还是做一个了解就行了。 Shell&#xff1a; 蛋壳的意思&#xff0c;是linux中比较重要的一个概念&#xff0c;所有的命令其实都称之为shell命令。 看图解&#xff1a;shell就是内核的一…

BUUCTF 大流量分析(三) 1

BUUCTF:https://buuoj.cn/challenges 文章目录 题目描述&#xff1a;密文&#xff1a;解题思路&#xff1a;flag&#xff1a; 相关阅读 CTF Wiki BUUCTF | 大流量分析 &#xff08;一&#xff09;&#xff08;二&#xff09;&#xff08;三&#xff09; 题目描述&#xff1a; …