首页 > 解决方案 > 在 Elasticsearch 中使用数字作为类型

问题描述

我将在 elasticsearch 上存储事务日志。我是 ELK 堆栈的新手,不确定如何在 ELK 堆栈上实现它。我的事务是顺序打印日志行(upserts),而不是将这些记录到文件中,我想将它们存储在 ElastichSearch 上,稍后我将通过我创建的 transactionId 查询日志。

通常查询的 URI 将是

/书店/书籍/_search

但就我而言,它必须像

/transactions/transactionId/_search

因为我不想将行存储为附加到单个事务记录的数组,但我不确定这是否是在每个事务开始时创建新类型的好习惯。我什至不确定这是否可能。

您能否就在 elasticsearch 上存储这些交易数据提供建议?

标签: elasticsearchlogstashkibanaelastic-stack

解决方案


如果您想使用类似的 URI 进行查询/transactions/transactionId/_search,这意味着您计划在每次新的 transactionid 出现时创建多种类型。现在,除了这是一个糟糕的设计之外,索引中甚至不可能有多个类型(发布版本 5.XI 猜测)并且类型自版本 7.X 以来已被完全删除。一种解决方法是在创建时使用 transactionId 本身作为文档 ID。然后,您可以通过查询获取与一个 transactionId 关联的日志GET transactions/transactionId(尽管了解文档 ID 的长度限制),但这可能会导致另一个问题,即同一事务可以有多个日志,因此每个日志条目都有相同的 id 只会覆盖前一个条目。这里最好的解决方案是更改查询这些记录的方式。

为此,您可以将 transactionId 作为 json 正文中的字段之一,以及在插入时创建的时间戳(让 ES 创建具有自动生成的 id 的文档),然后查询与事务关联的所有日志,例如:

POST transactions/_search
{
   "sort": [
    {
      "createdDate": {
        "order": "asc"
      }
    }
  ],
   "query":{
    "bool":{
      "must":[
        {
          "term":{
            "transactionId.keyword":"<transaction id>"
          }
        }
        ]
    }
  }
}

希望这可以帮助


推荐阅读