我正在尝试提出一种优化的架构来在 Elasticsearch 上存储事件日志消息。
这是我的规范/需求:
- 消息是只读的;一旦输入,他们只会被查询以进行报告。
- 没有自由文本搜索。用户将仅使用过滤器进行报告。
- 必须能够执行
时间戳
范围查询。 - 主要需要按
代理
和客户
交互(以及其他字段)进行过滤。 客户
和代理
属于同一位置
。
因此,最常执行的查询将是:获取给定 client_id
、customer_id
和 timestamp
的所有 LogItem
> 范围。
这是 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
}
}
}
最佳答案
您绝对可以搜索多个索引。例如,您可以使用通配符或逗号分隔的索引列表,但请记住索引名称是字符串,而不是日期。
分片不是用于组织数据,而是用于分发数据并最终横向扩展。如何做到这一点取决于您的数据以及您使用数据的用途。看看这个演讲:http://vimeo.com/44716955 .
关于您关于过滤器 VS 查询的问题,请查看 this其他问题。
关于java - 用于日志记录的 Elasticsearch - 需要架构建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19258185/