我正在计划一种用于在日期和用户方向上查询数百万个文档的策略。
使用路由或索引时有什么区别或优势?
最佳答案
Shay Banon @ Elasticsearch建议的设计模式之一是:按时间范围索引,按用户索引路由,并使用别名。
为每天(或日期范围)创建索引并在用户字段上路由文档,因此您可以“淘汰”较旧的日志,并且不需要在所有分片上执行查询:$ curl -XPOST localhost:9200/user_logs_20140418 -d '{
"mappings" : {
"user_log" : {
"_routing": {
"required": true,
"path": "user"
},
"properties" : {
"user" : { "type" : "string" },
"log_time": { "type": "date" }
}
}
}
}'
创建一个别名来过滤和路由用户,因此您可以查询用户'foo'的文档:$ curl -XPOST localhost:9200/_aliases -d '{
"actions": [{
"add": {
"alias": "user_foo",
"filter": {"term": {"user": "foo"}},
"routing": "foo"
}
}]
}'
为时间窗口创建别名,因此您可以查询文档“this_week”:$ curl -XPOST localhost:9200/_aliases -d '{
"actions": [{
"add": {
"index": ["user_logs_20140418", "user_logs_20140417", "user_logs_20140416", "user_logs_20140415", "user_logs_20140414"],
"alias": "this_week"
},
"remove": {
"index": ["user_logs_20140413", "user_logs_20140412", "user_logs_20140411", "user_logs_20140410", "user_logs_20140409", "user_logs_20140408", "user_logs_20140407"],
"alias": "this_week"
}
}]
}'
这种方法的一些优点: