elasticsearch 使用Logstash使用其他字段丰富ElasticSearch文档,elasticsearch,logstash,elasticsearch,Logstash" /> elasticsearch 使用Logstash使用其他字段丰富ElasticSearch文档,elasticsearch,logstash,elasticsearch,Logstash" />

elasticsearch 使用Logstash使用其他字段丰富ElasticSearch文档

elasticsearch 使用Logstash使用其他字段丰富ElasticSearch文档,elasticsearch,logstash,elasticsearch,Logstash,假设我有一个ElasticSearch实例,其中包含三种数据——作者、出版商和书籍——都是JSON格式的。 作者数据如下所示: { "document-id": "XYZ", "document-type": "author", "name": "John Doe", "country": "Canada" } { "document-id": "JKL", "document-type": "publisher", "name": "Random House" }

假设我有一个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"
}
,发布者数据如下所示:

{
  "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"
}
,书籍数据如下所示:

{
  "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值都存在,即使其中一个必须重命名;publisher.name和author.name也是如此)。 所有这些都将在Kibana报告中使用,据我所知,Kibana报告不太支持嵌套对象,尽管它似乎有一些支持,这可能会消除我的字段名冲突问题

实现这一目标的最佳方式是什么?我看到过一些讨论,这些讨论将我引向Logstash聚合过滤器,或者ElasticSearch输出插件,我不确定该追求什么。是否有必要进行日志存储,或者这是否可能与摄入管道有关

这两种文档类型是否需要位于同一索引中才能正常工作?这本书是应该用作者和出版商的数据来“充实”呢,还是应该将它们全部合并成第四种文档类型呢

我是ElasticSearch的新手,也是Logstash的新手,所以我非常感谢您提供的任何指导

谢谢


(在五天后没有收到回复后,从交叉发布。)

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

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

在您的例子中,您可以通过执行两个查询来解决问题,一个是从author和publisher索引中获取id,然后使用这些id来查询图书索引

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

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"]
          }
        }
      ]
    }
  }
}

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

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

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

在您的例子中,您可以通过执行两个查询来解决问题,一个是从author和publisher索引中获取id,然后使用这些id来查询图书索引

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

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"]
          }
        }
      ]
    }
  }
}

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

您可以修改示例文档以同时包含publisher数据吗?你的问题没有单一/简单的答案,但我会尝试一下……更新。提前感谢您的帮助!您能否修改示例文档以同时包含publisher数据?你的问题没有单一/简单的答案,但我会尝试一下……更新。提前感谢您的帮助!谢谢你,Val。但是考虑到这里的最终目标是Kibana可视化/报告,这两个步骤仍然相关吗?如果我想创建一个按出版商汇总的加拿大作者书籍平均价格数据表(即表中的每一行代表一个出版商,并包含该出版商所有加拿大作者书籍的平均价格),我为什么要这样做“每次作者或出版商更改时都可能需要重新生成完整索引”?是的,的确,这对于Kibana用例来说并不理想。然后,您需要将所有内容反规范化,并将所有必要的作者/出版商数据存储在图书文档中。“重新生成所有内容”的意思是为了防止您因任何原因错过某些更新(相信我,这会发生)谢谢。回到最初的问题,Logstash或ingest管道是否有任何方法可以帮助我做到这一点?这样,每当加载新书时,它都会自动使用作者和出版商的数据进行充实?还是我最好只增强我的(基于Java的)日志图书加载代码,以自行获取和添加作者和出版商?是的,Logstash可以帮助使用。但是,这仅适用于即将到来的新书。当作者/出版商数据发生更改,并且您需要更新已存储在图书索引中的所有现有图书记录时,它将不会帮助您。除非……您还在数据库中标记所有受影响的图书因此,Logstash将再次提取它们以重新编制索引,在这种情况下,您还需要在
jdbc_static
jdbc_streaming
过滤器中巧妙地选择过期策略。谢谢,Val。但是考虑到这里的最终目标是Kibana visualizat