【问题标题】:Joining logstash with parent record将logstash与父记录一起加入
【发布时间】:2016-10-18 14:30:35
【问题描述】:

我正在使用 logstash 来分析我的 Web 服务器访问。在这个时候,它工作得很好。我使用了一个配置文件,它为我产生了这种数据:

{
  "type": "apache_access",
  "clientip": "192.243.xxx.xxx",
  "verb": "GET",
  "request": "/publications/boreal:12345?direction=rtl&language=en",
  ...
  "url_path": "/publications/boreal:12345",
  "url_params": {
    "direction": "rtl",
    "language": "end"
  },
  "object_id": "boreal:12345"
  ...
}

此记录存储在“logstash-2016.10.02”索引中(每天一个索引)。 我还创建了另一个名为“publications”的索引。此索引包含发布元数据。 json 记录如下所示:

{
   "type": "publication",
   "id": "boreal:12345",
   "sm_title": "The title of the publication",
   "sm_type": "thesis",
   "sm_creator": [
     "Smith, John",
     "Dupont, Albert",
     "Reegan, Ronald"
   ],
   "sm_departement": [
     "UCL/CORE - Center for Operations Research and Econometrics",
   ],
   "sm_date": "2001",
   "ss_state": "A"
   ...
}

我想创建一个查询,例如 “授予我所有访问 'Smith, John' 出版物的权限”。 由于我所有的数据都没有进入同一个索引,我不能使用父子关系(我是对的吗?) 我在论坛上读到了这篇文章,但这是一篇旧文章:

By limiting itself to parent/child type relationships elasticsearch makes life 
easier for itself: a child is always indexed in the same shard as its parent,
so has_child doesn’t have to do awkward cross shard operations.

使用logstash,我不能将所有数据放在一个名为logstash 的索引中。按月我有超过 100 万的访问量......在 1 年内,我将有超过 1500 万条记录到 1 个索引中......我需要将网络访问数据存储至少 5 年(1M * 12 * 15 = 180M) . 我认为处理包含超过 18M 记录的单个索引不是一个好主意(如果我错了,请告诉我)。

我的问题是否存在解决方案?我没有找到任何漂亮的解决方案。 这次我的python脚本中唯一的一个是:第一个查询收集关于'Smith,John'出版物的所有id;每个发布的循环以获取此特定发布的所有 WebServer 访问权限。 因此,如果“Smith, John”有 321 个出版物,我向 ES 发送了 312 个 http 请求,并且响应时间不可接受(超过 7 秒;当您知道 ES 中的记录数但最终用户无法接受时,这还不错。 )

感谢您的帮助;对不起我的英语

雷诺

【问题讨论】:

    标签: elasticsearch logstash


    【解决方案1】:

    一个想法是使用elasticsearch logstash filter 以便在 Logstash 处理访问日志文档时获取给定的发布。

    该过滤器将检索publications 索引中具有相同object_idsm_creator 字段,并使用您需要的发布文档中的任何字段来丰富访问日志。此后,您可以简单地查询 logstash-* 索引。

    elasticsearch {
      hosts => ["localhost:9200"]
      index => publications
      query => "id:%{object_id}"
      fields => {"sm_creator" => "author"}
    }
    

    因此,之后您的访问日志文档将如下所示,对于 “给我所有访问 'Smith, John' 出版物的权限”,您可以简单地查询 sm_creator 字段你所有的logstash索引

    {
      "type": "apache_access",
      "clientip": "192.243.xxx.xxx",
      "verb": "GET",
      "request": "/publications/boreal:12345?direction=rtl&language=en",
      ...
      "url_path": "/publications/boreal:12345",
      "url_params": {
        "direction": "rtl",
        "language": "end"
      },
      "object_id": "boreal:12345",
      "author": [
        "Smith, John",
        "Dupont, Albert",
        "Reegan, Ronald"
      ],
      ...
    }
    

    【讨论】:

    • 非常感谢瓦尔!唯一的“问题”是,如果发布元数据发生更改,相应的访问日志将不会更改……这可能是最不坏的解决方案。
    • 如果出现这种情况,您仍然可以使用update by query API更新所有现有的访问日志
    • 然而,一份出版物的作者不太可能在出版物出版后随时间而改变,对吧?
    • 从技术上讲,你是对的。奇怪的是,在我的机构中,出版物作者每年可以更改 2 到 3 次....来自“Dupont, A.”。到“杜邦,阿尔伯特”到“杜邦,阿梅莉”。正如我所说的一个奇怪的世界:-)
    • 好吧,仍然是相同的自然人,但使用了不同的名称。明白了。然后通过查询更新就可以了。
    猜你喜欢
    • 2013-09-22
    • 2014-05-17
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 2016-01-25
    • 2021-06-16
    相关资源
    最近更新 更多