在 Elasticsearch 中毗连两个索引

打印 上一主题 下一主题

主题 1925|帖子 1925|积分 5775

作者:来自 Elastic Kofi Bartlett

解释如何使用 terms queryenrich processor 来毗连 Elasticsearch 中的两个索引。
更多有关毗连两个索引的查询,请参阅文章 “Elastic:开发者上手指南” 中的 “丰富数据及 lookup” 章节。

Elasticsearch 拥有丰富的新功能,资助你为本身的使用场景构建最佳搜刮办理方案。深入阅读我们的示例笔记本,相识更多信息,开始免费云端试用,或立即在本地机器上实验 Elastic。

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

 使用 terms query 毗连两个索引

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

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


  • # 第一步:查 index A,得到 id:
  1. GET index_a/_search
  2. {
  3.   "query": {
  4.     "match": {
  5.       "user": "alice"
  6.     }
  7.   }
  8. }
复制代码


  • 第二步:根据 index A 的结果查询 index B
  1. GET index_b/_search
  2. {
  3.   "query": {
  4.     "terms": {
  5.       "user_id": [ "123", "456" ]  # 从 index_a 拿到的 id
  6.     }
  7.   }
  8. }
复制代码
terms 查询还支持使用一种称为 terms lookup 的技能,在一次请求中实行上述两个步骤。Elasticsearch 会主动从另一个索引中检索匹配值。比方,你有一个名为 teams 的索引,里面包含球员列表:
  1. PUT teams/_doc/team1
  2. {
  3.   "players":   ["john", "bill", "michael"]
  4. }
  5. PUT teams/_doc/team2
  6. {
  7.   "players":   ["aaron", "joe", "donald"]
  8. }
复制代码
如今,可以查询 people 索引,获取全部在 team1 打球的人,如下所示:
  1. GET people/_search?pretty
  2. {
  3.   "query": {
  4.     "terms": {
  5.         "name" : {
  6.             "index" : "teams",
  7.             "id" : "team1",
  8.             "path" : "players"
  9.         }
  10.     }
  11.   }
  12. }
复制代码
在上面的例子中,Elasticsearch 会透明地从 teams 索引中的 team1 文档中检索球员名字(即“john”,“bill”,“michael”),并找到全部在 people 文档中 name 字段包含这些值的文档。等效的 SQL 查询如下:
  1. SELECT p.* FROM people p
  2. INNER JOIN teams t ON p.name = t.players
复制代码
更多阅读,请参阅 “Elasticsearch:Terms lookup query - 关联两个差别索引的搜刮”。

使用 enrich 处置惩罚器毗连两个索引

enrich 处置惩罚器是另一个强盛的工具,可以用于在 Elasticsearch 中毗连两个索引。此处置惩罚器通过从预定义的 enrich 索引中添加数据来丰富传入文档的数据。
以下是如何使用 enrich 处置惩罚器毗连两个索引的步骤:

  • 首先,你必要创建一个 enrich 策略。该策略定义了要用于丰富的索引以及要匹配的字段。下面是一个示例:
    1. PUT /_enrich/policy/my_enrich_policy
    2. {
    3.   "match": {
    4.     "indices": "first_index",
    5.     "match_field": "field_in_first_index",
    6.     "enrich_fields": ["field_to_enrich"]
    7.   }
    8. }
    复制代码
  •  一旦创建了策略,你必要实行它:  
    1. POST /_enrich/policy/my_enrich_policy/_execute
    复制代码
  • 实行策略后,你可以在摄取管道中使用 enrich 处置惩罚器来丰富传入文档的数据:
  1. PUT /_ingest/pipeline/my_pipeline
  2. {
  3.   "processors": [
  4.     {
  5.       "enrich": {
  6.         "policy_name": "my_enrich_policy",
  7.         "field": "field_in_second_index",
  8.         "target_field": "enriched_field"
  9.       }
  10.     }
  11.   ]
  12. }
复制代码
在这个例子中,field_in_second_index 是第二个索引中你想要用第一个索引的数据来丰富的字段,enriched_field 是将包含丰富数据的新字段。
这种方法的一个缺点是,假如第一个索引中的数据发生变化,丰富策略必要重新实行,因为丰富索引不会主动从源索引同步或更新。然而,假如第一个索引相对稳固,那么这种方法效果很好。
更多阅读,请参阅文章 “Elasticsearch:如何使用 Elasticsearch ingest 节点来丰富日志和指标” 及 “Elasticsearch:使用 Elasticsearch ingest pipeline 丰富数据”。

结论

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

原文:Joining two indexes in Elasticsearch - Elasticsearch Labs

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曹旭辉

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表