2

我正在尝试提出一个优化的架构来在 Elasticsearch 上存储事件日志消息。

这是我的规格/需求:

  • 消息是只读的;一旦输入,它们只会被查询以进行报告。
  • 没有自由文本搜索。用户将仅使用过滤器进行报告。
  • 必须能够进行timestamp范围查询。
  • 主要需要过滤agentcustomer交互(除了其他字段)。
  • customersagents属于同一个location

所以最常执行的查询是:get all LogItems given client_id, customer_id, and timestamprange。

这是 a 的LogItem样子:

"_source": {
    "agent_id" : 14,
    "location_id" : 2,
    "customer_id" : 5289,
    "timestamp" : 1320366520000, //Java Long millis since epoch
    "event_type" : 7,
    "screen_id" : 12
}

我需要帮助索引我的数据。

我一直在阅读什么是弹性搜索索引?使用弹性搜索为客户提供事件以了解良好的索引架构,但我需要专业人士的帮助。

所以这是我的问题:

  1. 文章建议创建“每天一个索引”。我将如何使用该架构进行范围查询?(例如:是否可以查询索引范围?)

  2. 目前我正在使用一个大索引。如果我为每个 location_id 创建一个索引,我如何使用分片来进一步组织我的记录?

  3. 鉴于上述规格,您可以建议更好的架构吗?

  4. 我应该使用 vs查询过滤哪些字段?

编辑:这是从我的应用程序运行的示例查询:

{
  "query" : {
    "bool" : {
      "must" : [ {
        "term" : {
          "agent_id" : 6
        }
      }, {
        "range" : {
          "timestamp" : {
            "from" : 1380610800000,
            "to" : 1381301940000,
            "include_lower" : true,
            "include_upper" : true
          }
        }
      }, {
        "terms" : {
          "event_type" : [ 4, 7, 11 ]
        }
      } ]
    }
  },
  "filter" : {
    "term" : {
      "customer_id" : 56241
    }
  }
}
4

2 回答 2

2

您绝对可以搜索多个索引。例如,您可以使用通配符或逗号分隔的索引列表,但请记住,索引名称是字符串,而不是日期。

分片不是用于组织您的数据,而是用于分发数据并最终向外扩展。你如何做到这一点取决于你的数据以及你用它做什么。看看这个演讲:http: //vimeo.com/44716955

关于您关于过滤器 VS 查询的问题,请查看其他问题。

于 2013-10-09T10:39:00.300 回答
1

好好看看logstash(和kibana)。他们都是为了解决这个问题。如果您决定为此推出自己的架构,您可能会复制他们的一些设计。

于 2013-10-13T13:16:19.097 回答