用于记录的Elasticsearch - 需要架构建议

时间:2013-10-08 20:53:37

标签: java elasticsearch

我正在尝试提出一种优化架构来在Elasticsearch上存储事件记录消息。

以下是我的规格/需求:

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

因此,最常执行的查询将是:获取LogItemclient_idcustomer_id范围内的所有timestamp

以下是LogItem的样子:

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

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

我一直在阅读what is an elasticsearch index?using elasticsearch to serve events for customers以了解良好的索引体系结构,但我需要专业人士的帮助。

所以这是我的问题:

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

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

  3. 根据上述规范,您可以建议更好的架构吗?

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

  5. 编辑:以下是从我的应用运行的示例查询:

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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