我正在计划一种用于在日期和用户方向上查询数百万个文档的策略。

  • 选项1-用户索引。按日期路由。
  • 选项2-按日期编制索引。用户路由。

  • 使用路由或索引时有什么区别或优势?

    最佳答案

    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"
        }
      }]
    }'
    

    这种方法的一些优点:
  • (如果使用用户别名进行搜索),则仅命中用户数据所在的碎片
  • 如果用户的数据增长,则可以考虑为该用户创建一个单独的索引(只需将用户的别名指向新索引)
  • 对分片的分配没有性能影响
  • 您可以通过简单地关闭(当关闭索引时,它们实际上不消耗资源)或删除整个索引(删除索引比删除索引中的文档更简单)来“淘汰”旧日志

  • 07-28 11:42