ElasticSearch:使用一个查询的输出作为另一个查询的输入

时间:2014-11-18 11:36:20

标签: elasticsearch subquery

我遇到一个问题,需要从elasticsearch获取基于id的doc并使用它来进行另一个查询。这有效,但我不得不两次往返弹性搜索集群。我可以在一个查询中以某种方式执行此操作,例如查询elasticsearch并将其输出用作另一个查询的输入以避免往返?

如果您不了解这个问题,请告诉我。

1 个答案:

答案 0 :(得分:1)

我想借此机会宣传针对特定问题的不同方法。事实上,ElasticSearch: The Definitive Guide本身做得非常好,我只需要引用它:

  

四种常用技术用于管理关系数据   Elasticsearch:

     
      
  • 应用程序端连接
  •   
  • 数据非规范化
  •   
  • 嵌套对象
  •   
  • 家长/子女关系
  •   
     

最终解决方案通常需要混合使用其中一些   技术。

实践中的数据非规范化意味着数据的存储方式是单个查询执行您在连续2次查询之前要执行的技巧。

在这里,我将从前面提到的书中展开the example。假设您有两个以下索引,并且您希望查找由任何名为John的人撰写的所有博客帖子:

PUT /my_index/user/1
{
  "name":     "John Smith",
  "email":    "john@smith.com",
  "dob":      "1970/10/24"
}

PUT /my_index/blogpost/2
{
  "title":    "Relationships",
  "body":     "It's complicated...",
  "userID":     1
}

除了首先获取数据库中所有Johns的ID之外别无选择。你可以做的是在blogpost对象上移动一些用户信息:

PUT /my_index/user/1
{
  "name":     "John Smith",
  "email":    "john@smith.com",
  "dob":      "1970/10/24"
}

PUT /my_index/blogpost/2
{
  "title":    "Relationships",
  "body":     "It's complicated...",
  "user":     {
    "id":       1,
    "name":     "John Smith" 
  }
}

因此,启用对user.name索引blogpost的搜索。

除了传统的ElasticSearch方法,您还可以考虑使用第三方插件,如Siren Join

  

此连接用于根据第二个文档集过滤一个文档集   文件集,因此它的名字。它相当于EXISTS()   SQL中的运算符。