在 Elasticsearch 中连接两个索引

作者:来自 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值