【问题标题】:elastic search embedded script optimization弹性搜索嵌入式脚本优化
【发布时间】:2014-12-19 11:27:41
【问题描述】:

有没有办法简化和优化以下查询:

{
  "query": {
    "filtered": {
      "filter": {
        "and": [
          {
            "range": {
              "ts": {
                "gte": "2014-12-18",
                "lte": "2014-12-18"
              }
            }
          }
        ]
      },
      "query": {
        "match": {
          "track_events.event": "render"
        }
      }
    }
  },
  "aggs": {
    "per_type": {
      "terms": {
        "field": "type",
        "order": {
          "_count": "desc"
        },
        "size": 0
      },
      "aggs": {
        "per_hour": {
          "terms": {
            "script": "(doc[\"track_events.ts\"].value - doc[\"ts\"].value)/(1000 * 3600)",
            "order": {
              "_count": "desc"
            },
            "size": 0
          }
        }
      }
    }
  }
}

elasticsearch 中的索引包含字段为track_events.tsts 的文档。目的是计算在track_events.tsts 之间的每小时间隔中存在多少次。 示例响应:

                "buckets": [{
                    "key": "0",
                    "doc_count": 67736997
                },
                {
                    "key": "1",
                    "doc_count": 7193214
                },
                {
                    "key": "2",
                    "doc_count": 3406966
                },
                {
                    "key": "3",
                    "doc_count": 1988135
                }]
            }

这意味着67736997计数发现时差小于1小时,7193214计数时差小于2小时,等等。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    最大的性能提升是替换脚本。

    即而不是这样做:

    (doc[\"track_events.ts\"].value - doc[\"ts\"].value)/(1000 * 3600)
    

    在将数据加载到 Elasticsearch 并将其放入另一个字段时预先计算此值。然后改为在该字段上进行术语聚合。

    【讨论】:

      猜你喜欢
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-05
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多