繁体   English   中英

使用 Logstash 来丰富一个 ElasticSearch 文档中的字段

[英]Use Logstash to enrich one ElasticSearch document with fields from another

想象一下,我有一个 ElasticSearch 实例,其中包含三种数据 - 作者、出版商和书籍 - 全部采用 JSON 格式。 作者数据如下所示:

{
  "document-id": "XYZ",
  "document-type": "author",
  "name": "John Doe",
  "country": "Canada"
}

,发布者数据如下所示:

{
  "document-id": "JKL",
  "document-type": "publisher",
  "name": "Random House"
}

,书籍数据如下所示:

{
  "document-id": "ABC",
  "document-type": "book",
  "authorId": "XYZ",
  "publisherId": "JKL",
  "title": "Logstash for Dummies"
}

截至目前,每个都进入自己的索引。

我想创建数据的非规范化版本,以便我可以轻松搜索由加拿大作者撰写或由兰登书屋出版的所有书籍。 我需要支持对作者、出版商和书籍数据的更新,这样如果作者搬到新的国家或更改他们的名字,非规范化副本也将被更新。

我还需要保留非规范化副本中所有对象的所有字段(即,避免两个文档 ID 字段之间的冲突,以便两个文档 ID 值都存在,即使必须重命名一个;发布者也是如此。姓名和作者姓名)。 所有这些都将用于 Kibana 报告中,据我所知,它对嵌套对象没有很好的支持,尽管它似乎有一些支持,这可能会消除我对字段名称冲突的担忧。

实现这一目标的最佳方法是什么? 我看过一些讨论,让我转向 Logstash 聚合过滤器或 ElasticSearch 输出插件,但我不确定要追求什么。 Logstash 甚至是必要的,还是可以通过摄取管道实现?

两种文档类型是否都需要在同一个索引中才能使其工作? 应该用作者和出版商数据“丰富”书籍,还是应该将它们全部组合成第四种文档类型?

我是 ElasticSearch 的新手,也是 Logstash 的新手,所以我很感激你能提供的任何指导。

谢谢!

(从https://discuss.elastic.co/t/enrich-one-document-with-fields-from-another/208651交叉发布,五天后没有收到回复。)

最好的方法确实是尝试将所有数据非规范化为“书”文档。 然而,这并不总是理想的,特别是如果合并的数据(作者、出版商)会随着时间的推移而改变,在这种情况下,您需要更新所有相关的图书文档(通常使用通过查询 API 更新)并且可能必须重建完整的每次作者或出版商更改时索引。

正如我所说,没有简单的答案,也没有正确或错误的答案。 它始终取决于您要支持的用例。

在您的情况下,您可以通过执行两个查询来摆脱困境,一个是从作者和出版商索引中获取 ID,然后使用这些 ID 来查询图书索引。

例如,如果您需要检索 Random House 出版的加拿大作者的所有书籍,您首先要发出以下查询:

POST _msearch
{ "index" : "authors" }
{ "query" : { "term": { "country": "Canada" }}}
{ "index" : "publisher" }
{ "query" : { "term": { "name": "Random House" }}}

然后使用检索到的文档的 id,您可以向书籍索引发出查询:

POST books/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "authorId": ["XYZ1", "XYZ2", "XYZ3"]
          }
        },
        {
          "terms": {
            "publisherId": ["ABC1"]
          }
        }
      ]
    }
  }
}

在您的情况下,我显然不会采用父/子或嵌套方式,因为要保持所有内容同步,开销太大。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM