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

Glo*_*ior 8 subquery elasticsearch

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

如果您不理解这个问题,请告诉我.

Nik*_*iev 3

我想利用这个机会宣传解决给定问题的不同方法。事实上,《ElasticSearch:权威指南》本身就做得相当不错,我只需引用它:

Elasticsearch 中使用四种常见技术来管理关系数据:

  • 应用程序端连接
  • 数据反规范化
  • 嵌套对象
  • 亲子关系

最终的解决方案通常需要结合使用其中的几种技术。

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

这里我将展开上述书中的例子。假设您有以下两个索引,并且您希望查找任何名为 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
}
Run Code Online (Sandbox Code Playgroud)

没有其他选择,只能首先获取数据库中所有约翰的 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" 
  }
}
Run Code Online (Sandbox Code Playgroud)

user.name因此可以对索引进行搜索blogpost

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

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