elasticsearch - 使用Logstash丰富一个ElasticSearch文档中的另一个字段

标签 elasticsearch logstash

想象一下,我有一个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字段之间发生冲突,以便即使必须重命名两个document-id值也都存在;发布者也是如此。名称和author.name)。
据我了解,所有这些都将在Kibana报告中使用,据我了解,它似乎对嵌套对象没有很好的支持,尽管它似乎确实有一些支持,这可能消除了我对字段名冲突的担忧。

实现此目标的最佳方法是什么?我已经看到了使我转向Logstash聚合过滤器或ElasticSearch输出插件的讨论,但我不确定该怎么做。 Logstash甚至是必需的,还是可以通过摄取管道来实现?

为了使此文档有效,两种文档类型都需要在同一索引中吗?并且应该将作者和出版商的数据“丰富”起来,还是应该将它们全部合并为第四种文档类型?

我是ElasticSearch的新手,并且是Logstash的完整新手,因此,感谢您提供的任何指导。

谢谢!

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

最佳答案

最好的方法确实是尝试将所有数据非规范化为“书籍”文档。但是,这并不总是理想的,特别是如果合并的数据(作者,出版商)可以随时间变化,在这种情况下,您需要更新所有相关的书籍文档(通常使用update by query 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"]
          }
        }
      ]
    }
  }
}

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

关于elasticsearch - 使用Logstash丰富一个ElasticSearch文档中的另一个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59027646/

相关文章:

elasticsearch - Elasticsearch转换文档格式

elasticsearch - 如何使用elasticsearch在logstash中映射geoip字段,以便在Kibana4的平铺 map 中显示它

amazon-web-services - 我们可以更新 cloudformation 堆栈以将 kinesis 传输流目标配置从 s3 更改为 elasticsearch 吗?

python - 计算 Elasticsearch 中索引中的文档数

kubernetes - 按 pod 名称过滤 Kubernetes API

logstash - 如何在logstash中加载CSV文件

elasticsearch - 使用Logstash配置读取和使用Elasticsearch Metada

elasticsearch - 使用 logstash 和 kibana 分析来自日志文件的延迟

elasticsearch - 将日志从 kafka 传输到 elasticsearch

ruby-on-rails-3.2 - ElasticSearch与ThinkingSphinx的替代语法