我正在尝试提出一种优化架构来在Elasticsearch上存储事件记录消息。
以下是我的规格/需求:
timestamp
范围查询。agent
和customer
互动进行过滤(除了其他字段外)。customers
和agents
属于同一个location
。因此,最常执行的查询将是:获取LogItem
,client_id
和customer_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以了解良好的索引体系结构,但我需要专业人士的帮助。
所以这是我的问题:
文章建议创建“每天一个指数”。 我如何使用该架构进行范围查询?(例如:是否可以查询索引范围?)
目前我正在使用一个大索引。 如果我为location_id创建一个索引,如何使用分片进一步组织我的记录?
根据上述规范,您可以建议更好的架构吗?
我应该使用查询 过滤哪些字段?
编辑:以下是从我的应用运行的示例查询:
{
"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
}
}
}
答案 0 :(得分:2)
你绝对可以搜索多个索引。例如,您可以使用通配符或以逗号分隔的索引列表,但请记住,索引名称是字符串,而不是日期。
碎片不是用于组织数据,而是用于分发数据并最终向外扩展。如何做到这一点取决于您的数据以及您使用它做什么。看看这个演讲:http://vimeo.com/44716955。
关于有关过滤器VS查询的问题,请查看this其他问题。
答案 1 :(得分:1)
好好看看logstash(和kibana)。他们都是为了解决这个问题。如果你决定为此推出自己的架构,你可以复制他们的一些设计。